|
Программирование >> Исключение дубликатов строк
DISTINCT Типизированное выражение pMl♦ > *> > >>>>>>w♦* !>>w<<il>тw!?w -* FROM - имялаблицы l.............. корреляционноеимя JOIN имялоблицы OUTER LEf=T RIGHT корреляционноеимя - Условие поиска USING имястолбца Рис. 9.3. Определение OUTER JOIN no двум таблицам M !И*MйjWS:W <! У Необходимой частью любого JOIN является условие ON или USING, расположенное после имени второй таблицы и указывающее системе базы данных, как выполнять соединение. Для разрешения этого соединения СУБД логически объединяет каждую строку в первой таблице с каждой строкой во второй таблице (такое объединение называется декартовым произведением). Затем к ним применяется критерий, указанный в условиях ON или USING, чтобы найти строки, удовлетворяющие критерию, которые должны быть возвращены. Поскольку запрашивается OUTER JOIN, СУБД также возвращает строки, не удовлетворяющие условию, из левой либо правой таблицы. В условии ON, внутри соединения, может использоваться условие поиска для определения логической проверки, результат которой должен иметь значение True для возвращения любых двух связанных строк. Указывать условие поиска имеет смысл только в том случае, если хотя бы один столбец из первой таблицы сравнивается по крайней мере с одйим столбцом второй таблицы. Хотя можно записать очень сложное условие поиска, обычно определяется проверка простого условия равенства по первичному ключу одной таблицы со столбцами внешних ключей второй таблицы. Для упрощения начнем с того же примера Recipes и Recipe Classes, который использовался в предыдущей главе. Вспомните, что в хорошо спроектированной базе данных следует выделить сложные квалификационные имена во вторую таблицу, а затем связывать эти иена с исходной таблицей предмета через простое значение ключа. В учебной базе данных Рецепты Recipe Classes заносятся в отдельную от Recipes таблицу. На рис. 9.4 показано отношение между Recipe Classes и Recipes. Recipe Classes RecjpeCtassfD PK RecipeClassDescription Рис. 9.4. Recipes RecJpelD RecipeTitle RecipeClassID Preparation Notes Виды рецептов находятся в отдельной таблице, отличной от таблицы рецептов Когда изначально заполняются виды рецептов для сохранения в базе данных, можно начать с ввода всех видов рецептов, которые вспоминаются. Когда введено большое количество рецептов, возможно, будет интересно выяснить, для каких видов рецептов пока еш,е не введено ни одного. Также стоит попробовать вывести список всех видов рецептов вместе с названиями рецептов, введенных для каждого из видов. Эту задачу можно решить с помош,ью OUTER JOIN. Внимание! В этой главе используется метод Запрос/Преобразование/Уточнение/SQL , введенный в главе 4. Show те all of the recipe types and any matching recipes in my database . ( Показать все типы рецептов и соответствующие им рецепты в базе данных .) Преобразование: Select recipe class description and recipe title from the recipe classes table outer joined with the recipes table on recipe class ID in the recipes classes table matching recipe class ID in the recipes table (Выбрать описание вида рецепта и наименование рецепта из таблицы Виды рецептов с внешним соединением с таблицей Рецепты по идентификатору вида рецепта в таблице Виды рецептов , совпадаюш,ие с идентификатором вида рецептов в таблице Рецепты ) Select recipe class description а ё recipe title from the recipe classes table outer joined with the recipes table on recipe class ID in the recipes classes table matching = recipe class ID in the recipes table (Выбрать описание вида рецепта, название рецепта из Виды рецептов с внешним соединением с Рецепты Уточнение: по идентификатору вида рецепта вида рецептов) идентификатору SQL SELECT Recipe Classes.RecipeClassDescription, Recipes.RecipeTitle FROM RecipeClasses LEFT OUTER JOIN Recipes ON Recipe Classes.RecipeClassID = Recipes.RecipeClassID Внимание! Хотя OUTER JOIN поддерживается большинством коммерческих реализаций SQL, некоторые реализации все же его не поддерживают. Если ваша база данных не поддерживает OUTER JOIN, задачу все-таки можно решить путем перечисления всех нужных таблиц в условии FROM, а затем перемеш.ения условия поиска из условия ON в условие WHERE. Обратитесь к документации по своей базе данных, чтобы узнать конкретный нестандартный синтаксис, который требуется вашей базе данных для определения OUTER JOIN. Например, ранние версии Microsoft SQL Server поддерживают такой синтаксис (обратите внимание на звездочку в условии WHERE): SELECT RecipeClasses.RecipeClassDescription, Recipes.RecipeTitle FROM Recipe Classes, Recipes WHERE RecipeClasses.RecipeClassID *= Recipes.RecipeClassID Если используется Oracle, то синтаксис следуюший (обратите внимание на знак плюс в условии WHERE): SELECT RecipeClasses.RecipeClassDescription, Recipes.RecipeTitle FROM RecipeClasses, Recipes WHERE RecipeClasses.RecipeClassID = Recipes.RecipeClassID(+) Для начинаюш.его этот синтаксис, вероятно, интуитивно намного более понятен в применении к простым запросам. Однако синтаксис стандарта SQL позволяет полностью определить источник для конечного набора результатов целиком внутри условия FROM. Рассматривайте условие FROM как полное определение связанного набора результатов, из которого СУБД получает ответ В стандарте SQL условие WHERE используется только для отфильтровывания строк набора результатов, определенного условием FROM. Также, поскольку специальный синтаксис для определения OUTER JOIN через условие WHERE отличается для разных продуктов, при работе с несколькими нестандартными продуктами необходимо изучить несколько различных синтаксисов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |