|
Программирование >> Исключение дубликатов строк
представлены все компоненты, которые пока еще даже не используются ни в одном рецепте, но будут отсутствовать виды рецептов, для которых нет рецептов, или рецепты, которые не содержат компонентов. Если СУБД решает выполнить запрос путем исполнения условий JOIN другим образом, то будут присутствовать виды рецептов, не имеющие рецептов, и рецепты, не имеющие компонентов, но будут отсутствовать компоненты, не используемые пока еще ни в одном из рецептов, вследствие проблем, связанных с сопоставлением с Null. Некоторые системы баз данных могут распознать эту логическую проблему и отклонить выполнение этого запроса совсем. При этом будет получено сообщение об ошибке типа неоднозначное OUTER JOIN . Проблема, с которой мы сталкиваемся в данном случае, является результатом попытки перемещения в противоположном направлении по отношению один-ко-многим в OUTER JOIN, имеющему другое направление. Спускаться по склону легко, но движение в обратном направлении требует специальных приспособлений. Как решить эту проблему, мы расскажем в следующем разделе. FULL OUT6R JOIN FULL OUTER JOIN не является ни левым , ни правым - оно является двусторонним! В него включаются все строки из обеих таблиц или наборов результатов, используемых в JOIN. Когда отсутствуют строки, выполняющие условие, с левой стороны JOIN, то в наборе результата справа будут присутствовать значения Null. Наоборбт, когда отсутствуют строки, выполняющие условие, с правой стороны JOIN, то значения Null будут присутствовать в наборе результата слева . Синтоксис Теперь, когда вы немного поработали с операциями JOIN, синтаксис для FULL OUTER JOIN вполне понятен. Синтаксическая диаграмма для FULL OUTER JOIN показана на рис. 9.13. CHSTtNCT Типи$ированно0 выражение FROM Ссылка на таблицу FULL Ссылка на таблицу 3! - OUTER Ш: JOIN )/Ьловие поиска *ишл :. I-. тт. Рис. 9.13. FULL OUTER JOIN Для упрощения вместо имени таблицы, оператора SELECT или результата другого JOIN теперь используется термин ссылка на таблицу . Посмотрим на задачу из предыдущей главы с другой стороны. Теперь можно решить ее надлежащим образом, используя FULL OUTER JOIN: 7 need all of the recipe types and then all of the recipe names, preparations, and instructions, and then any matching ingredient step numbers, ingredient quantities, and ingredient measurements, and finally all ingredient names from my Recipes database sorted in step number sequence . ( Нужны все виды рецептов, все названия рецептов, последовательность приготовления и указания, инструкции, а затем номера последовательности этапов для каждого выполняющего условие компонента, количество компонента и единицы измерения компонента и, наконец, названия всех компонентов из базы данных Рецепты , отсортированные по номерам этапов .) Преобразование: Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, and measurement description from the recipe classes table full outer joined with the recipes table on recipe class ID, then left outer joined with the recipe ingredients table on recipe ID, then joined with the measurements table on measurement amount ID, and then finally full outer joined with the ingredients table on ingredient ID, order by recipe title and recipe sequence number (Выбрать описание вида рецепта, заголовок рецепта, инструкции по приготовлению, название компонента, порядковый номер рецепта, количество и описание единиц измерения из таблицы Виды рецептов с полным внешним соединением с таблицей Рецепты по идентификатору вида рецепта, затем с левым внешним соединением с таблицей Компоненты рецепта по идентификатору рецепта, соединенной с таблицей Единицы измерения по идентификатору единиц измерения количества, а затем, наконец, с полным внешним соединением с таблицей Компоненты по идентификатору компонента, упорядоченные по заголовку рецепта и порядковому номеру рецепта) Уточнение: Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, ttne measurement description from the recipe classes table full outer oined with the recipes table on recipe class ID, then left outer joined with the recipe ingredients table on recipelD, theft joined with the measurements table on measurement amount ID, and then finally full outer joined with the ingredients table on ingredient ID, order by recipe title me recipe sequence number (Выбрать описание вида рецепта, заголовок рецепта, приготовление, название компонента, порядковый номер эецепта, количество, описание единиц измерения из Виды рецептов с полным внешним соединением с Рецепты по идентификатору вида рецепта, с левым внешним соединением с Компоненты рецепта по идентификатору рецепта, соединенной с Единицы измерения по идентификатору единиц измерения количества, с полным внешним соединением с Компоненты по идентификатору компонента, упорядоченные по заголовку рецепта, порядковому номеру рецепта) SELECT RecipeClasses.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, RecipeIngredients.RecipeSeqNo, Recipe Ing redients.Amount, Measu rements.Measu rementDesc ription FROM RecipeClasses FULL OUTER JOIN (((Recipes LEFT OUTER JOIN Recipe Ing redients Recipes.RecipelD = Recipe Ingredients.RecipelD) INNER JOIN Measurements ON Measurements. MeasureAmountID = Recipe Ingredients.MeasureAmountID) FULL OUTER JOIN Ingredients ON Ingredients.IngredientlD = Recipelngredients.IngredientlD) ON Recipe Classes.RecipeClassID = Recipes.RecipeClassID ORDER BY RecipeTitle, RecipeSeqNo
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |