Читаем Понимание SQL полностью

FROM Salespeople a, Orders b

WHEREa.snum=b.snum

AND b.amt=

( SELECT MIN (amt)

FROM Orders c

WHERE c.odate=b.odate )

ORDER BY 3;

SQL Execution Log

SELECT min (amt) FROM Orders c

WHERE c.odate=b.odate) ORDER BY 3;

1007

Rifkin

3001

Lowest on

10/03/1990

1002

Serres

3005

Highest on

10/03/1990

1002

Serres

3007

Lowest on

10/04/1990

1001

Peel

3008

Highest on

10/05/1990

1001

Peel

3008

Lowest on

10/05/1990

1003

Axelrod

3009

Highest on

10/04/1990

1002

Serres

3010

Lowest on

10/06/1990

1001

Peel

3011

Highest on

10/06/1990

Таблица 14.5: Формирование объединения с использованием ORDER BY

Пока ORDER BY используется по умолчанию, мы не должны его указывать.

Мы можем упорядочить наш вывод с помощью нескольких полей, одно внутри другого и указать ASC или DESC для каждого, точно также как мы делали это для одиночных запросов. Заметьте, что номер 3 в предложении ORDER BY указывает какой столбец из предложения SELECT будет упорядочен. Так как столбцы объединения - это столбцы вывода, они не имеют имен, и следовательно, должны определяться по номеру. Этот номер указывает на их место среди других столбцов вывода. (Смотрите Главу 7, обсуждающую столбцы вывода.)

ВНЕШНЕЕ ОБЪЕДИНЕНИЕ

Операция которая бывает часто полезна - это объединение из двух запросов в котором второй запрос выбирает строки, исключенные первым. Наиболее часто, вы будете делать это, так чтобы не исключать строки которые не удовлетворили предикату при объединении таблиц. Это называется - внешним обьединением. Предположим что некоторые из ваших заказчиков еще не были назначены к продавцам. Вы можете захотеть увидеть имена и города всех ваших заказчиков, с именами их продавцов, не учитывая тех кто еще не был назначен. Вы можете достичь этого, формируя объединение из двух запросов, один из которых выполняет обьединение, а другой выбирает заказчиков с пустыми(NULL) значениями поля snum. Этот последний запрос должен вставлять пробелы в поля соответствующие полю sname в первом запросе. Как и раньше, вы можете вставлять текстовые строки в ваш вывод чтобы идентифицировать запрос который вывел данную строку. Использование этой методики во внешнем обьединении, дает возможность использовать предикаты для классификации, а не для исключения.

Мы использовали пример нахождения продавцов с заказчиками размещенными в их городах и раньше. Однако вместо просто выбора только этих строк, вы возможно захотите чтобы ваш вывод перечислял всех продавцов, и указывал тех, кто не имел заказчиков в их городах, и кто имел. Следующий запрос, чей вывод показывается в Таблице 14.6, выполнит это:

SELECT Salespeople.snum, sname, cname, comm

FROM (Salespeople, Customers

WHERE Salespeople.city=Customers.city.

UNION

SELECT snum, sname, ' NO MATCH ', comm

FROM (Salespeople

WHERE NOT city=ANY

( SELECT city

FROM Customers )

ORDER BY 2 DESC;

SQL Execution Log

FROM Salespeople WHERE NOT city=ANYate)

( SELECT city FROM Customers) ORDER BY 2 DESC;

1002

Serres

Cisneros

0.1300

1002

Serres

Liu

0.1300

1007

Rifkin

NO MATCH

0.1500

1001

Peel

Clemens

0.1200

1001

Peel

Hoffman

0.1200

1004

Motika

Clemens

0.1100

1004

Motika

Hoffman

0.1100

1003

Axelrod

NO MATCH

0.1000

Таблица 14. 6: Внешнее обьединение

Строка 'NO MATCH' была дополнена пробелами, чтобы получить совпадение поля cname по длине (это не обязательно во всех реализациях SQL). Второй запрос выбирает даже те строки которые исключил первый. Вы можете также добавить комментарий или выражение к вашему запросу, ввиде дополнительного поля. Если вы сделаете это, вы будете должны добавить некоторый дополнительный комментарий или выражение, в той же самой позиции среди выбранных полей, для каждого запроса в операции объединения. Совместимость UNION предотвращает вас от добавления дополнительного поля для первого запроса, но не для второго. Имеется запрос который добавляет строки к выбранным полям, и указывает совпадает ли данный продавец с его заказчиком в его городе:

SELECT a.snum, sname, a.city, ' MATCHED '

FROM Salespeople a, Customers b

WHERE a.city=b.city

UNION

SELECT snum, sname, city, 'NO MATCH'

FROM Salespeople

WHERE NOT city=ANY

( SELECT city

FROM Customers )

ORDER BY 2 DESC;

Таблица 14,7 показывает вывод этого запроса.

SQL Execution Log

WHERE a.city=b.city UNION SELECT snum,sname,city, 'NO MATCH'

FROM Salespeople WHERE NOT city=ANYate)

( SELECT city FROM Customers) ORDER BY 2 DESC;

1002

Serres

San Jose

MATCHED

1007

Rifkin

Barselona

NO MATCH

1001

Peel

London

MATCHED

1004

Motika

London

MATCHED

1003

Axelrod

New York

NO MATCH

Таблица 14. 7: Внешнее обьединение с полем коментария

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT