Программирование >>  Исключение дубликатов строк 

1 ... 84 85 86 [ 87 ] 88 89 90 ... 152


При использовании нескольких таблиц в условии FROM помните о необходимости полного уточнения имени каждого столбца с именем таблицы при каждом его использовании, чтобы было абсолютно ясно, какой столбец из какой таблицы нужен. Необходимо также уточнить имя RecipeClassID в условии ON, потому что имеются два столбца с именем RecipeClassID - один в таблице Recipes и епде один

в таблице Recipe Classes.

Если выполнить приведенный выше запрос в учебной базе данных Recipes, то он должен вернуть 16 строк. Поскольку в эту базу данных не вводили каких-либо рецептов для вида Soup (Суп), то в строке, для которой RecipeClassDescription имеет значение Soup, в столбце RecipeTitle будет получено значение Null. Чтобы найти только эту строку, воспользуйтесь следуюидим подходом:

List the recipe classes that do not yet have any recipes . ( Привести список видов рецептов, в которых пока еше нет ни одного рецепта .)

Преобразование: Select recipe class description from the recipe classes table

outer joined with the recipes table on recipe class ID where recipe ID is empty

(Выбрать описание вида рецепта из таблицы Вид рецепта с внешним соединением с таблицей Рецепты по идентификатору вида рецепта, где идентификатор рецепта пуст)

Уточнение: Select recipe class description from the recipe classes table

outer joined with the recipes table on recipe class ID where recipe ID is empty NULL (Выбрать описание вида рецепта из Вид рецепта с внешним соединением с Рецепты по идентификатору вида рецепта, где идентификатор рецепта NULL)

SQL SELECT RecipeClasses. RecipeClassDescription

FROM Recipe Classes LEFT OUTER JOIN Recipes ON RecipeClasses.RecipeClassID =

Recipes.RecipeClassID WHERE Recipes.RecipelD IS NULL

Подумав немного, можно понять, что здесь просто выполняется операция DIFFERENCE или EXCEPT (см. главу 7) с использованием JOIN. Это несколько похоже на запрос: Показать все виды рецепты за исключением (EXCEPT) тех, которые уже имеются в таблице Рецепты . Диаграмма для множеств на рис. 9.5 поможет представить, о чем идет речь.




Рис. 9.5.

Возможное отношение между видами рецептов и рецептами

На рис. 9.5 все рецепты относятся к какому-то виду, но супдествуют некоторые виды, для которых рецепты епде не определены. При добавлении проверки IS NULL запрашиваются все строки в более светлом внешнем круге, для которых отсутствуют совпадения во множестве рецептов, представленном в более темном внутреннем круге.

Диаграмма д/ш OUTER JOIN в таблице на рис. 9.3 также содержит необязательное условие USING. Если столбцы, удовлетворяюпдие условию, в обеих таблицах имеют одинаковое имя и нужно просто соединить их по равным значениям, то можно воспользоваться условием USING и перечислить имена столбцов. Решим предыдуш,ую задачу заново, на этот раз используя USING:

Display the recipe classes that do not yet have any recipes . ( Вывести на экран виды рецептов, в которых пока еще нет рецептов .)

Уточнение:

Преобразование: Select recipe class description from the recipe classes table

outer joined with the recipes table using recipe class ID where recipe ID is empty

(Выбрать описание вида рецепта из таблицы Виды рецептов с внешним соединением с таблицей Рецепты , используя идентификатор вида рецепта, где идентификатор рецепта является пустым)

Select recipe class description from the recipe classes table outer joined with the recipes table using recipe class ID where recipe ID is empty NULL (Выбрать описание вида рецепта из Виды рецептов с внешним соединением с Рецепты , используя идентификатор вида рецепта, где идентификатор рецепта NULL)

SELECT Recipe.Classes.RecipeClassDescription FROM Recipe.Classes LEFT OUTER JOIN Recipes USING (RecipeClassID) WHERE Recipes.RecipelD IS NULL

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



Внимание! Стандарт SQL также определяет вид операции JOIN, называемый NATURAL JOIN. Операция NATURAL JOIN связывает две определенные таблицы по совпадению всех столбцов с одинаковыми именами. Если общими столбцами являются только связывающие столбцы и база данных поддерживает NATURAL JOIN, то приведенную выше задачу можно решить таким образом:

SELECT Recipe Classes.RecipeClassDescription

FROM Recipe Classes

NATURAL LEFT OUTER JOIN Recipes

WHERE Recipes.RecipelD IS NULL

He определяйте условие ON или USING при использовании ключевого слова NATURAL.

Вложение опероторо S6L6CT

Большинство реализаций SQL позволяют заменять взятый в целом оператор SELECT на имя таблицы в условии FROM. Конечно, затем обязательно нужно назначить корреляционное имя (см. раздел о присвоении имен-псевдонимов в главе 8), чтобы результат оценки вложенного запроса имел имя. На рис. 9.6 представлен процесс составления условия OUTER JOIN с использованием вложенных операторов SELECT.

Оператор SELECT может включать все условия запроса, за исключением условия ORDER BY. Также можно смешивать и согласовывать операторы SELECT с именами таблиц по любую сторону ключевого слова OUTER JOIN.


i;iiiii:i;rt;iiiii[iijiiiiiN!ti!iiii!y

ililiiiiiiMiilli


..ij.i. ji I i.ii, iii.ii II . ....... Ill iiii II I I li M,i ppj Vji





I .1



.1 ..

!. 11> ,у1>,1!>!<И1> 1И > 1;1>111Ц1 HWiWtyyiiiiijHWH!1.1,1;i.jtjilfBPH 11 -\





iHi I jiiiii.....)..... i<iiiiiiiiiii........iiii(VHiiii;iiiliiijiiiiiiiiiin г yi iiь\y;ii...rilt,i, 1-чм iriiii>iH. ¥rt*.- -V№

iji>iiiiiiijiiij)ljiii>iiiij


Рис. 9.6. OUTER JOIN с использованием операторов SELECT



1 ... 84 85 86 [ 87 ] 88 89 90 ... 152

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