|
Программирование >> Исключение дубликатов строк
Оператор 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
Рис. 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |