|
Программирование >> Построение запросов sql
1) вычисляется декартово произведение таблиц, входящих в соединение, т. е. для каждой строки одной из таблиц берутся все возможные сочетания строк из других таблиц; 2) производится отбор строк из полученной таблицы согласно условию поиска в предложении WHERE; 3) осуществляется проекция (вывод) по столбцам, указанным в списке возвращаемых элементов. Среди запросов на соединение таблиц наиболее распространены запросы к таблицам, которые связаны с помощью отношения родитель-потомок. Чтобы использовать в запросе отношение родитель-потомок, необходимо задать <условие соединения>, в котором первичный ключ родительской таблицы сравнивается с внешним ключом таблицы-потомка (обычно имена этих столбцов совпадают в связанных таблицах). Несмотря на то, что в языке определения данных присутствует возможность декларативного задания первичных и внешних ключей таблиц, связь, о которой идет речь, должна всегда явно указываться в предложении WHERE запроса SELECT. Например, необходимо вывести для всех абонентов названия улиц, на которых они проживают. Для этого надо каждую запись из таблицы Abonent связать по полю внешнего ключа (столбец StreetCD в таблице Abonent) с таблицей улиц (столбец StreetCD в таблице Street). Следующий запрос позволяет получить требуемый результат: SELECT Abonent.Fio, Street.StreetCD, Street.Streetnm FROM Abonent, Street WHERE Abonent.StreetCD = Street.StreetCD;. Результат выполнения запроса представлен на рис. 3.64.
Рис. 3.64. Результат выполнения многотабличного запроса Следует обратить внимание на то, что к полям таблиц обращение производится на основе полного имени столбца (то есть с указанием таблицы, к которой он относится), чтобы исключить неоднозначности, возникающие в случае присутствия в разных таблицах полей с одинаковыми именами (например, полей StreetCD в таблицах Abonent и Street). Чтобы ускорить ввод запросов и сделать их более понятными, в списке таблиц можно определить псевдонимы таблиц (сокращенные имена). Например, предыдущий запрос можно записать более кратко: SELECT A.Fio, S.StreetCD, S.Streetnm FROM Abonent A, Street S WHERE A.StreetCD = S.StreetCD;. В многотабличном запросе можно комбинировать условие соединения, в котором задаются связанные столбцы (соединение с помощью равенства), с условиями поиска. Например, для вывода фамилий абонентов, которым за месяцы 2001 года начислены суммы более 50, можно использовать следующий запрос: SELECT A.Fio, N.NachislSum FROM Abonent A, NachislSumma N WHERE A.AccountCD = N.AccountCD AND NachislYear = 2001 AND NachislSum > 50;. Результат выполнения запроса представлен на рис. 3.65.
Рис. 3.65. Результат выполнения многотабличного запроса с комбинированным условием поиска Термин соединение применяется к любому запросу, который объединяет данные нескольких таблиц БД путем сравнения значений в парах столбцов этих таблиц. Самыми распространенными являются соединения, созданные на основе равенства связанных столбцов (соединения по равенству). Кроме того, имеется возможность соединять таблицы с помощью других операций сравнения. Например, чтобы вывести все комбинации фамилий абонентов и исполнителей ремонтных заявок так, чтобы фамилии абонентов были больше при сравнении, можно использовать следующий запрос с соединением таблиц по неравенству: SELECT A.Fio, E.Fio FROM Abonent A, Executor E WHERE A.Fio > E.Fio;. Как следует из данного примера, соединения таблиц по условиям, отличающимся от равенства, во многом искусственны. Поэтому в подавляющем большинстве случаев таблицы соединяются по равенству, а другие операции сравнения используются для дополнительного отбора строк в условии поиска. SQL позволяет соединять три и более таблицы, используя ту же самую методику, что и при соединении данных из двух таблиц. Например, чтобы для предыдущего запроса вместе с начисленной суммой вывести и заплаченную сумму за тот же период и за ту же услугу газоснабжения, можно использовать следующее соединение трёх таблиц: SELECT A.Fio, N.NachislSum, P.PaySum FROM Abonent A, NachislSumma N, PaySumma P WHERE A.AccountCD = N. AccountCD AND NachislYear = 2001 AND NachislSum > 50 AND A.AccountCD = P.AccountCD AND NachislMonth =PayMonth AND NachislYear = PayYear AND N.GazserviceCD = P.GazserviceCD;. Результат выполнения запроса представлен на рис. 3.66.
Рис. 3.66. Результат выполнения запроса на соединение трех таблиц Следует отметить, что результат выполнения запроса на неявное соединение более двух таблиц не зависит от порядка перечисления этих таблиц в предложении FROM и от порядка указания условий соединения в предложении WHERE. В таблицах соединяются только те строки, для которых выполняется <условие соединения>, и независимо от порядка соединения результат будет одинаковый. Можно соединять данные из трех и более таблиц, связанных более чем одним отношением родитель-потомок. Например, для того чтобы определить исполнителей, которым назначены ремонтные заявки абонентов, необходимо соединить таблицы Abonent, Request и Executor. Для этого надо каждую запись из таблицы Request связать по полю внешнего ключа AccountCD со справочником абонентов (столбец AccountCD в таблице Abonent), а по полю внешнего ключа ExecutorCD - со справочником исполнителей (столбец ExecutorCD в таблице Executor). Для этого можно использовать следующий запрос:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |