|
Программирование >> Программирование баз данных
А в табл. 3.5 приведен пример таблицы Actors. Таблица 3.5. Таблица Actors FilmlD FirstName LastName 1 Rex Harrison 1 Audrey Hepburn 2 Clint Eastwood 5 Humphrey Bogart После использования операции выборки с конструкцией INNER JOIN результирующий набор принимает такой вид, как показано в табл. 3.6. Таблица 3.6. Результаты выполнения операции внутреннего соединения
Обратите внимание на то, что в этом результирующем наборе не встречается фамилия актера Bogey. Это связано с тем, что соответствующая строка в таблице Films отсутствует. В результирующий набор не включается строка, для которой отсутствуют согласующиеся поля в обеих таблицах. Внутренние соединения по своему характеру являются исключительными; под этим подраззмевается, что любая строка, для которой нет соответствия в обеих таблицах, неизбежно исключается из окончательного варианта результирующего набора. Теперь перейдем к рассмотрению самих примеров кода. Вначале рассмотрим упрощенную версию синтаксиса: SELECT <select list> FROM <first table> [<alias>] <join type> <second table> [<alias>] [ON <join condition>][;] Это - синтаксис, предусмотренный стандартом ANSI; он может успешно применяться не только в СУБД SQL Server, но и в СУБД других типов, в то время как старый вариант синтаксиса, о котором уже шла речь в данной главе, такой гарантии не дает (тем не менее он все еще используется многими разработчиками и в наши дни, о чем также еще будет сказано в этой главе). Вызовите на выполнение программу Management Studio и проведите испытания операторов с конструкцией INNER JOIN, применив следующий код по отношению к базе данных AdventureWorks: SELECT * FROM HumanResources.Employее e INNER JOIN HumanResources.Employee m ON e.ManagerID = m.EmployeelD; Результаты этого запроса занимают слишком много места, чтобы их можно было привести в данной книге, но, вообще говоря, при его выполнении должно быть получено немногим меньше чем 300 строк. В целом в отношении результатов этого запроса необходимо сделать несколько замечаний, приведенных ниже. Прежде всего, нам удалось успешно соединить две таблицы, причем фактически выполнено соединение таблицы с самой собой; это позволяет сравнивать различные строки, относящиеся к одной и той же таблице (в данном случае водном представлении таблица рассматривается как содержащая данные о руководителях, а в другом - как таблица с данными обо всех служащих). Для этого мы обязаны были использовать псевдонимы для обозначения таблицы (в рассматриваемом случае были выбраны псевдонимы е и т). В обеих ссылках на эту таблицу был предусмотрен возврат всех столбцов. А если бы в этих ссылках упоминались разные таблицы, то были бы обнаружены имена столбцов из обеих таблиц. В результатах обнаруживаются данные из обоих наборов столбцов, но отсутствует возможность определить, какие из этих данных относятся к тому или другому (одни и те же имена столбцов встречаются дважды, но в этих столбцах часто представлены разные значения). Таким образом, в операторах соединения следует более четко давать определения тех результатов, которые должны быть получены с их помощью, и полностью раскрывать логику конструкций JOIN: SELECT e.EmployeelD, се.FirstName, се.LastName, m.EmployeelD AS ManagerlD, cm.FirstName AS ManagerFirst, cm.LastName AS ManagerLast FROM HumanResources.Employee e INNER JOIN HumanResources.Employee m ON e.ManagerlD = m.EmployeelD INNER JOIN Person.Contact ce ON e.ContactID = ce.ContactID INNER JOIN Person.Contact cm ON m.ContactID = cm.ContactID; Приведенный выше оператор является довольно сложным, поскольку в нем воплощены почти все концепции, лежащие в основе внутренних соединений, поэтому ниже приведено его подробное описание, и, в частности, каждый из компонентов рассматривается отдельно, начиная со следующей конструкции: FROM HumanResources.Employee е INNER JOIN HumanResources.Employee m ON e.ManagerlD = m.EmployeelD В этой конструкции воплощен первоначальный вариант соединения, в котором формируется соединение таблицы с самой собой. Таблицу, применительно к которой по каким-то причинам выполняется операция, предусматривающая соединение таблицы самой с собой, принято называть таблицей, ссылающейся на саму себя. Поскольку в одном операторе упоминаются два экземпляра одной и той же таблицы, приходится задавать для этой таблицы псевдонимы, чтобы иметь возможность определить, на какой экземпляр данной таблицы мы ссылаемся в той или иной точке запроса. INNER JOIN Person.Contact се ON e.ContactID = ce.ContactID INNER JOIN Person.Contact cm ON m.ContactID = cm.ContactID Для получения данных об именах служащих выполняется соединение с таблицей Contact. Характерная особенность проекта базы данных, рассматриваемой в этом примере, состоит в том, что архитектор данных предусмотрел выделение информации о производственных контактах в отдельную таблицу, поскольку не исключено, что служащий компании может также оказаться ее клиентом. Но следует отметить, что соединение с таблицей Contact должно быть выполнено дважды: один раз для формирования соединения с данными об имени служащего и второй раз - для соединения с данными об имени руководителя. SELECT е.EmployeelD, се.FirstName, се.LastName, m.EmployeelD AS ManagerlD, cm.FirstName AS ManagerFirst, cm.LastName AS ManagerLast В рассматриваемом операторе заслуживают также внимания некоторые изменения в списке выборки. Прежде всего список выборки был конкретизирован и ограничен только теми столбцами, которые с наибольшей вероятностью должны содержать интересую1цую нас информацию (в данном случае информацию о том, какие служащие подчиняются тем или другим руководителям). Кроме того, обе таблицы применяются больше чем в одном экземпляре, поэтому необходимо обозначить псевдонимом не просто каждую таблицу, но и каждый экземпляр таблицы, в которой имеются столбцы, предназначенные для формирования выходных данных. В качестве дополнительной информации следует указать, что по умолчанию применяются внутренние соединения. Кроме того, ключевое слово INNER является необязательным. В действительности на практике может быть обнаружено, что большинство разработчиков программного обеспечения на языке SQL не применяют это ключевое слово, чтобы запрос состоял из меньшего количества слов. Поэтом), учитывая все сказанное выше, можно преобразовать рассматриваемый запрос в следующую форму: SELECT е.EmployeelD, се.FirstName, се.LastName, m.EmployeelD AS ManagerlD, cm.FirstName AS ManagerFirst, cm.LastName AS ManagerLast FROM HumanResources.Employee e JOIN HumanResources.Employee m ON e.ManagerlD = m.EmployeelD JOIN Person.Contact ce ON e.ContactID = ce.ContactID JOIN Person.Contact cm ON m.ContactID = cm.ContactID; В СУБД SQL Server этот запрос обрабатывается столь же успешно и приводит к получению таких же результатов. Внешние запросы Применение конструкции JOIN такого типа, как OUTER JOIN, скорее можно считать исключением, а не правилом. Разумеется, причина такой ситуации заключается не в том, что эти конструкции не позволяют выполнять какую-либо полезную работу, а, скорее, в следующем. Чаще всего при выборке данных с использованием оператора соединения необходимо обеспечить, чтобы данные соответствовали всем заданным критериям, а этого позволяет добиться только конструкция INNER JOIN.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |