Программирование >>  Sql: полное руководство 

1 ... 44 45 46 [ 47 ] 48 49 50 ... 264


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 *

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

Chicago

Betty

Chicago

Chicago

Anne

Denver

NULL

NULL

Nancy

NOLL

NULL

NULL

NOLL

NULL

James

Dallas

NOLL

NOLL

George

NULL

Таблица GIRLS

Таблица BOYS

NAHE

CITY

Mary

Boston

Nancy

NUtL

Susan

Chicago

Betty

Chicago

Anne

Denver

Несовпадающие строки

NAHE

CITY

John

Boston

Henry

Boston

George

NULL

Chicago

James

Da 11 as


Несовпадающие строки

Результаты внешнего объединения

GIRtS NAM!

GIRtS CITY

BOYS NAHE

BOYS CITY

Mary

Boston

John

Boston

Mary

Boston

Henry

Boston

Susan

Chicago

Chicago

Betty

Chicago

Chicago

Anne

Denver

NULL

NULL

Nancy

NULL

NULL

NULL

NUtt

NULL

James

Dal las

NUtt

NULL

George

NULL

Рис 7 12 Внешнее объединение

Внешнее объединение двух таблиц содержит восемь строк Четыре строки идентичны строкам внутреннего объединения этих таблиц Две другие строки, для Анны и Нэнси, являются несвязанными строками таблицы girls Эти строки были расширены значениями null, т е приравнены к воображаемой строке таблицы boys, содержащей только значения null, и добавлены в результаты запроса Две последние строки, для Джеймса и Джорджа, являются несвязанными строками таблицы boys Эти строки также были расширены значениями null (приравнены к воображаемой строке таблицы girls, содержащей только значения null) и добавлены в результаты запроса

Как видно из этого примера, внешнее объединение является объединением, сохраняющим информацию Каждая строка таблицы boys представлена в таблице результатов запроса (некоторые более одного раза) Аналогично, каждая строка табли4.г girls представлена в таблице результатов (некоторые, опять-таки, более одного раза)



1 ... 44 45 46 [ 47 ] 48 49 50 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика