|
Программирование >> Sql: полное руководство
Bill Adams 13 Mary Jones 11 Sue Smith 21 Sam Clark 11 Bob Smith 12 Dan Roberts 12 Tom Snyder NOLL Larry Fitch 21 Paul Cruz 12 Nancy Angelli 22 Вывеши список служащих и городов, где они работают. SELECT NAME, CITY FROM SALESREPS, OFFICES WHERE REP OFFICE = OFFICE NAME CITY Mary Jones New York Sam Clark New York Bob Smith Chicago Paul Cruz Chicago Dan Roberts Chicago Bill Adams Atlanta Sue Smith Los Angeles Larry Fitch Los Angeles Nancy Angelli Denver Ha первый взгляд, эти два запроса должны давать одинаковое количество строк, но результаты первого запроса насчитывают десять строк, а второго - только девять Почему? Потому что Том Снайдер (Тот Snyder) в настоящий момент еще не получил назначение ни в один офис и его строка имеет значение null в столбце rep office (это связанный столбец,для данного объединения). Значение null не совпадает ни с одним идентификатором офиса в таблице offices, поэтому строка для Тома Снайдера в таблице salesreps остается без пары. В результате она исчезает из объединения. Таким образом, стандартное SQL-объединение может привести к потере информации, если объединяемые таблицы содержат несвязанные строки. Опираясь на словесную версию второго запроса, можно предположить, что требуется получить результаты, которые возвращает следующий запрос: Вывести список служащих и городов, где они работают. SELECT NAME, CITY FROM SALESREPS, OFFICES WHERE REP OFFICE *= OFFICE NAME CITY Tom Snyder NULL Mary Jones New York Sam Clark New York Bob Smith Chicago Paul Сг)г£ Chicago Dan Roberts Chicago Bill Adams Atlanta Sue Smith Los Angeles Larry Fitch Los Angeles Nancy Angelli Denver Такие результаты запроса получаются с помощью другой операции объединения, называемой внешним объединением таблиц (в предложении where оно обозначается символами *=). Внешнее объединение является расширением стандартного объединения, описанного ранее в настоящей главе и иногда называемого внутренним объединением таблиц. В стандарте SQL1 дано определение только внутреннего объединения; йонятие внешнего объединения в нем отсутствует. Ранние СУБД фирмы IBM также поддерживают только внутреннее объединение. Однако внешнее объединение является понятной и полезной частью реляционной модели базы данных и реализовано во многих СУБД, включая SQL Server, Oracle, Sybase и Informix. Как показано ниже, внешнее объединение - это наиболее естественный способ для выражения запросов определенного типа. Чтобы понять смысл внешнего объединения, будет полезно отвлечься от учебной базы данных и рассмотреть две простые таблицы, изображенные на рис. 7.12. В таблице girls находится список пяти девочек и городов, в которых они живут; в таблице boys содержится список пяти мальчиков и их городов. Чтобы найти пары девочек и мальчиков, живущих в одном и том же городе, можно использовать следующий запрос, формирующий внутреннее объединение двух таблиц: Вывести список девонек и мальчиков, живущих в одних и тех же городах. SELECT * FROM GIRLS, BOYS WHERE GIRLS.CITY = BOYS.CITY GIRLS.NAME GIRLS.CITY BOYS.NAME BOYS.CITY Mary Boston John Boston Mary Boston Henry Boston Susan Chicago Sam Chicago Betty Chicago Sam Chicago Внутреннее объединение дает четыре строки в таблице результатов запроса. Обратите внимание, что две девочки (Анна (Anne) и Нэнси (Nancy)) и два мальчика (Джеймс (James) и Джордж (George)) не представлены в таблице результатов запроса. Эти строки не имеют пары в другой таблице и поэтому отсутствуют в таблице результатов внутреннего объединения. Две несвязанные строки (Анна и Джеймс) имеют действительные значения в столбцах city, но они не совпадают ни с одним городом в противоположной таблице. Две другие несвязанные строки (Нэнси и Джордж) имеют в столбцах city значение null, а по правилам SQL значение null не равно никакому аруому значению (даже другому значению null). Предположим, что вы хотите вывести список пар девочка/мальчик, живущих в одних и тех же городах, и вютючить в него девочек и мальчиков без пары. Этот результат дает внешнее объединение таблиц girls и boys. Схема формирования внешнего объединения изображена на рис. 7.12, а в табл. 7.2 приведена последовательность построения внешнего объединения. Вот инструкция SQL, дающая в результате внешнее объединение: Вывести список девочек и мальчиков из одних и тех же городов, включая тех, кто не имеет пары SELECT *
Таблица GIRLS Таблица BOYS
Несовпадающие строки
Несовпадающие строки Результаты внешнего объединения
Рис 7 12 Внешнее объединение Внешнее объединение двух таблиц содержит восемь строк Четыре строки идентичны строкам внутреннего объединения этих таблиц Две другие строки, для Анны и Нэнси, являются несвязанными строками таблицы girls Эти строки были расширены значениями null, т е приравнены к воображаемой строке таблицы boys, содержащей только значения null, и добавлены в результаты запроса Две последние строки, для Джеймса и Джорджа, являются несвязанными строками таблицы boys Эти строки также были расширены значениями null (приравнены к воображаемой строке таблицы girls, содержащей только значения null) и добавлены в результаты запроса Как видно из этого примера, внешнее объединение является объединением, сохраняющим информацию Каждая строка таблицы boys представлена в таблице результатов запроса (некоторые более одного раза) Аналогично, каждая строка табли4.г girls представлена в таблице результатов (некоторые, опять-таки, более одного раза)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |