Программирование >>  Руководство по sql 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 105


Внешние объединения

При выполнении описываемых до сих пор объединений в результат включались только строки, удовлетворяющие условиям объединения. Однако вы можете захотеть поместить туда также и строки одной из таблиц, не удовлетворяющие условиям объединения.

При внещнем объединении обычно в результат дополнительно включаются строки из первой таблицы, не удовлетворяющие условиям объединения. С помощью другого оператора внещнего объединения в результат можно включить все строки из второй таблицы, не удовлетворяющие условиям объединения, или даже такие строки из обеих таблиц. SQL-92 поддерживает только либо левое (LEFT), либо правое (RIGHT) внещнее объединение. Так как производители поддерживали эти возможности еще до появления общего стандарта, различные их реализации могут сильно различаться. В одних системах внещнее объединение определяется в предложении FROM, в других - в предложении WHERE. За подробной информацией обратитесь к руководству по своей системе. В Transact-SQL для определения внещнего определения в предложении WHERE используются следующие обозначения:

Символ Значение

*= Включить все строки первой таблицы

=* Включить все строки второй таблицы

Эти же обозначения поддерживаются и в SQL Anywhere.

Как вы помните, в результате выполнения запроса, в котором ищутся авторы, живущие в одном городе с издателем, возвращается два имени (Abraham Bennet и Cheryl Carson).

Чтобы включить в результат все имена из таблицы authors, независимо от того, удовлетворяют ли они условиям объединения, можно использовать внещнее объединение:

SQL:

select au fname, au lname, pub name

from authors, publishers

where authors.city *= publishers.city

Результат:

au fname

au Iname

pub name

Abraham

Bennet

Algodata Infosystems

Marjorie

Green

NULL

Cheryl

Carson

Algodata Infosystems

Albert

Ringer

NULL

Anne

Ringer

NULL

Michel

DeFrance

NULL

Sylvia

Panteley

NULL

Heather

McBadden

NULL

Dirk

Stringer

NULL

Dick

Straight

NULL

Livia

Karsen

NULL

Stearns

MacFeather

NULL

Dull

NULL

Akiko

Yokomoto

NULL

Michael

OLeary

NULL

Burt

Gringlesby

NULL

Morningstar

Greene

NULL



Johnson White NULL

Innes del Castillo NULL

Sheryl Hunter NULL

Chastity Locksley NULL

Reginald Blotchet-Halls NULL

Meander Smith NULL

Оператор внешнего объединения *= заставляет систему включитъ в результат все строки из первой таблицы (в нашем случае authors), независимо от того, совпадают ли значения в ее столбце city с соответствующими значениями из таблицы publishers.

Оператор внешнего объединения =* заставляет систему включить в результат все строки из второй таблицы, независимо от того, совпадают ли их значения со значениями из первой таблицы.

Подставив в предыдуший запрос оператор правого внешнего объединения, вы получите имена издателей, находяшихся в городе, в котором живет какой либо автор, а также имена издателей, не удовлетворяющих этому условию:

SQL:

select au fname, au lname, pub name

from authors, publishers

where authors.city =* publishers.city

Результат:

au fname au lname pub name

NULL NULL New Age Books

NULL NULL Binnet & Hardley

Cheryl Carson Algodata Infosystems

Abraham Bennet Algodata Infosystems

Как и в случае обычных объединений, для офаничения результатов внешнего объединения можно использовать условные операторы. Давайте сначала рассмотрим объединение, основанное на равенстве, а затем сравним его результаты с результатами внешнего объединения. Например, чтобы найти названия книг, количество проданных экземпляров которых превысило 50, можно использовать следующий запрос:

SQL:

select sonum, title

from salesdetails sd, titles t

where qty ordered > 50

and sd.title id = t.title id

Результат:

sonum title

1 Is Anger the Enemy?

Чтобы, кроме того, найти все названия книг, не удовлетворяющих этому условию, нужно воспользоваться внешним объединением:

SQL:

select sonum, title

from salesdetails sd, titles t

where qty ordered > 50

and sd.title id =* t.title id



Результат:

sonum title

NULL Secrets of Silicon Valley

NULL The Busy Executives Database Guide

NULL Emotional Security: A New Algorithm

NULL Prolonged Data Deprivation: Four Case Studies

NULL Cooking with Computers: Surreptitious Balance Sheets

NULL Silicon Valley Gastronomic Treats

NULL Sushi, Anyone?

NULL Fifty Years in Buckingham Palace Kitchens

NULL But Is It User Friendly?

NULL The Psychology of Computer Cooking

NULL You Can Combat Computer Stress!

1 Is Anger the Enemy?

NULL Life Without Fear

NULL The Gourmet Microwave

NULL Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean

NULL Straight Talk About Computers

NULL Computer Phobic and Non-Phobic Individuals: Behavior Variations

NULL Net Etiquette

КАК ОБЪЕДИНЕНИЯ ОБРАБАТЫВАЮТСЯ СИСТЕМОЙ

в запросе на объединение совсем не сложно допустить ошибку. Если в получаемом результате содержится слишком много строк или повторений, то, скорее всего, в запрос нужно внести какие-нибудь изменения. Однако по получаемым результатам очень трудно разобраться в том, как запросы на объединение обрабатываются в реляционных системах.

Первым шагом обработки запроса на объединение является построение декартова произведения таблиц - всех возможных комбинаций строк из обеих таблиц. После получения декартова произведения столбцы из списка выбора используются для выполнения операций проектирования, а условия в предложении WHERE - для выбора, чтобы устранить строки, которые не удовлетворяют условиям объединения.

Декартово произведение - это матрица всех возможных комбинаций, которые могут удовлетворять условиям объединения. Если в каждой таблице содержится по одной строке, то и комбинация будет единственной. Для примера рассмотрим две таблицы, содержащие по одной строке:

one two

а b

three four

Декартово произведение этих таблиц имеет следующий вид:

one two three four

abed

Если в каждой таблице содержится по две строки, то в декартовом произведении будет четыре строки:



1 ... 47 48 49 [ 50 ] 51 52 53 ... 105

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