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

1 ... 109 110 111 [ 112 ] 113 114 115 ... 152


Оператор SELECT

О- SELECT -X- ТиптироваиноФ выражение

!i-Nli! iN-4 iji

псевдоним

iiHilii:iiitii>ii[i

i;ijH(iiiiiiiiiii*)ii !w tHi

О) nj>i>iiiM iiiiiii;iwi i>ii 111(*.1!1Нф1*!! ;Ч

FROM

Ссылка HO юблицу

iiiHM4iHt iwiw <

WHERE - Тит$ироваинре выражение

)WHWllWW> <H>l lyHi HWi .i! P.iiIWW WI lil

(Выражение $BL£CT)

/ Типизированное vj \T выражение Т/

Рис. 11.7. Использование подзапроса в предикате IN


Ingredient Classes

V V J. * Д .( V * * * й < ta V !. 4. . Ч * J. * и Hf > fc . <. и . * * * .fc

IngredienlClassID

tngredientCfassDescription


Ingredients


IngredientID PK IngrediemName

IngredientCiassID F/C MeasureAmountID


RecipeIngredients

RecipelD

RecipeSeqNo

IngredientID

MeasureAmountID

Amount


Recipes

. k % & tf. h > > Й 4 V ъ * i * k

RecipelD PK

RecipeTitle

RecipeClassID FK

Preparation

Notes

Рис. 11.8. Таблицы, используемые для вывода рецептов и их компонентов

List all ту recipes that have a Seafood ingredient . ( Предоставить список рецептов, содержащих компоненты из морепродуктов .)

Преобразование: Select recipe title from the recipes table where the recipe

ID is in the selection of recipe IDs from the recipe ingredients table where the ingredient ID is in the selection of ingredient IDs from the ingredients table joined with the ingredient classes table on ingredient class ID where ingredient class description is seafood (Выбрать заголовок рецепта из таблицы Рецепты , где идентификатор рецепта выбирается в идентификаторах



рецептов из таблицы Компоненты рецепта , где идентификатор компонента выбирается в идентификаторах компонентов из таблицы Компоненты , соединенной с таблицей Классы компонентов по идентификатору класса компонента, где описание класса компонента - морепродукты )

Уточнение: Select recipe title from the recipes table where the recipe

ID ts in the (selection of recipe IDs from the recipe ingredients table where the ingredient ID ts in the (selection of ingredient IDs from the ingredients table joined with the ingredient classes table on ingredient class ID where ingredient class description ts = seafood )) (Выбрать заголовок рецепта из Рецепты , где идентификатор рецепта в (Выбрать идентификатор рецептов из Компоненты рецепта , где идентификатор компонента (Выбрать идентификатор компонента из Компоненты , соединенной с Классы компонентов по идентификатору класса компонента, где описание класса компонента = морепродукты ))

SQL SELECT RecipeTitle

FROM Recipes

WHERE Recipes.RecipelD IN (SELECT RecipelD FROM RecipeIngredients WHERE RecipeIngredients.IngredientlD IN (SELECT IngredientlD FROM Ingredients INNER JOIN Ingredient.Classes ON Ingredients.IngredientClassID =

Ingredient Classes.IngredientClassID WHERE

IngredientClasses.IngredientCiassDescription = Seafood))

Приходило ли вам на ум, что можно поместить подзапрос внутрь подзапроса? Мы действительно можем переместиться на уровень глубже, исключив INNER JOIN из второго подзапроса. Второй подзапрос можно записать, воспользовавшись следующим синтаксисом:

SQL . . CSELECT IngredientlD

FROM Ingredients

WHERE Ingredients.IngredientClassID IN (SELECT IngredientClassID



FROM IngredientClasses WHERE

Ingredient.Classes.IngredientClassDescnption = Seafood))

Однако это было бы избыточным, потому что вложение условий IN в условия IN только затрудняет чтение запроса. Мы это сделали просто для того, чтобы показать, что это возможно. Тем не менее стоит повторно заявить, что возможность сделать что-то не означает необходимость это делать! Надеемся, вы согласитесь, что легче всего увидеть что произойдет, используя в подзапросе единственный предикат IN и более сложный оператор JOIN. Вот еще одно решение с использованием этого метода:

sql select RecipeTitle

FROM Recipes

where Recipes.RecipelD IN (SELECT RecipelD FROM (RecipeIngredients INNER JOIN Ingredients ON RecipeIngredients.IngredientID =

Ingredients.IngredientID) INNER JOIN Ingredient.Classes ON Ingredients.IngredientClassID =

Ing redient.Classes.Ing redientClassID

where

IngredientClasses.IngredientClassDescription = Seafood)

Зачем преодолевать все эти трудности? Почему просто не выполнить сложное соединение во внешнем запросе и закончить с этим? Причина в том, что будет получен неверный ответ! В действительности все возвращенные строки будут строками для рецептов с морепродуктами из таблицы Рецепты , но можно получить некоторые строки более одного раза. Попробуем решить эту задачу, не используя подзапрос, чтобы увидеть, почему будут получены повторяющиеся строки:

SQL SELECT RecipeTitle

FROM ((Recipes

INNER JOIN Recipe.Ingredients

ON Recipes.RecipelD - RecipeIngredients.RecipelD)

INNER JOIN Ingredients

ON Recipe.Ingredients.IngredientID =

Ingredients.IngredientID) INNER JOIN Ingredient.Classes ON Ingredients.IngredientClassID = Ing redientClasses.Ing redientClassID



1 ... 109 110 111 [ 112 ] 113 114 115 ... 152

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