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

1 ... 70 71 72 [ 73 ] 74 75 76 ... 152


ON Recipe Classes.RecipeClassID = Recipes.ReclpeClassID

Используя условие FROM нескольких таблиц, следует всегда полностью сверять имя ка>вдого столбца с именем таблицы, когда бы он ни использовался, чтобы было абсолютно понятно, какой столбец из какой таблицы нужен. Здесь нам требуется уточнить имя RecipeClassID в условии ON , потому что существуют два столбца с именами RecipeClassID - один в таблице Recipes и второй в таблице Recipe Classes. Имена столбцов RecipeTitle, Preparation или RecipeClassDescription в условии SELECT уточнять не требуется, потому что каждое из них появляется только один раз во всех таблицах. Если RecipeClassID нужно включить в вывод, то системе базы данных нужно указать, какой именно RecipeClassID нужен - из таблицы Recipe Classes или из Recipes. Чтобы записать этот запрос со всеми полностью уточненными именами, укажите их следующим образом:

SQL SELECT Recipes.RecipeTitle,

Recipes.Preparation,

Recipe Classes.RecipeClassDescription FROM RecipeClasses INNER JOIN Recipes ON Recipe Classes.RecipeClassID =

Recipes.RecipeClassID

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

SELECT Recipes.RecipeTitle, Recipes.Preparation, Recipe Classes.RecipeClassDesc ription

FROM Recipe Classes, Recipes

WHERE RecipeClasses.RecipeClassID = Recipes.RecipeClassID

Для начинающего этот синтаксис для простых запросов, вероятно, интуитивно намного более понятен. Тем не менее синтаксис стандарта SQL позволяет полностью определить источник для конечного набора результатов целиком внутри условия FROM. Представьте себе условие FROM как полное определение связанного набора результатов, из которого СУБД получает ответ В стандарте SQL условие WHERE используется только для фильтрации строк набора результатов, определенного условием FROM.



Не слишком сложно, не так ли? А как насчет условия USING, показанного на рис. 8.1 ? Если совпадающие столбцы в двух таблицах имеют одинаковые имена и требуется только соединить равные значения, воспользуйтесь условием USING и перечислите имена столбцов. Решим предыдущую задачу снова, на этот раз с использованием USING:

Show те the recipe title, preparation, and recipe class description of all recipes in my database .

( Показать название рецепта, способ приготовления и описание вида рецепта для всех рецептов в моей базе данных .)

Преобразование: Select recipe title, preparation, and recipe class description

from the recipe classes table joined with the recipes table using recipe class ID

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

Select recipe title, preparation, me recipe class description from the recipe classes table joined with the recipes table using recipe class ID

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

SELECT Recipes.RecipeTitte, Recipes.Preparation,

Recipe Classes.RecipeClassDescription FROM Recipe Classes INNER JOIN Recipes USING (RecipeClassID)

Уточнение:

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

SELECT Recipes.ReciepeTitle, Recipes.Preparation,

RecipeClasses.RecipeClassDescription FROM RecipeClasses ATURAL INNER JOIN Recipes

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



Некоторые системы баз данных пока еще не поддерживают использование USING. Однако всегда можно получить тот же результат в условии ON и условии сравнения на равенство.

СУБД логически создает комбинацию каждой строки из первой таблицы с каждой строкой из второй таблицы, а затем применяет условие ON или USING. Это воспринимается как большой объем дополнительной работы для базы данных: вначале построить все комбинации, а затем отфильтровать потенциально несколько строк, удовлетворяющих условиям.

В остальном все современные системы баз данных оценивают условие JOIN целиком, прежде чем начать извлечение строк. Приведенный выше пример многие системы базы данных начинают решать с извлечения строки из Recipe Classes. Затем база данных использует внутреннюю связь - индекс (если он был определен разработчиком таблиц) - для быстрого поиска всех строк из Recipe, удовлетворяющих условиям для первого Recipe Classes, прежде чем перейти к следующей строке в Recipe Classes. Другими словами, база данных использует интеллектуальный

и ...... ......У>13

или оптимизированный план извлечения только тех строк, которые удовлетворяют условиям. Это кажется неважным, когда таблицы базы данных содержат всего несколько сотен строк, но приводит к серьезным отличиям, когда база данных должна распоряжаться сотнями тысяч строк!

Нозночвнив корреляционных имен (псевдонимов) тоблицом

Стандарт SQL определяет способ назначения псевдонима (алиаса) - называемого в стандарте корреляционным именем - любой таблице, перечисленной в условии FROM. Эта возможность может быть очень удобной при построении сложных запросов с использованием таблиц, имеющих длинные описательные имена. Таблице можно назначить короткое корреляционное имя, чтобы облегчить явное указание столбцов в таблице с длинным именем.

На рис. 8.3 показано, как назначить корреляционное имя таблице в условии FROM.

Для того чтобы назначить корреляционное имя таблице, укажите после ее имени необязательное ключевое слово AS, а затем корреляционное имя, которое нужно присвоить. (Как и для всех необязательных ключевых слов, AS рекомендуется использовать для того, чтобы облегчить чтение и понимание запроса.) После назначения таблице корреляционного имени это имя используется вместо ее исходного имени во всех других условиях, включая условие SELECT, условия поиска в условиях ON и WHERE и условие ORDER BY. Это может немного сбить с толку, потому что обычно имеется склонность записывать условие SELECT до того, как записывается условие FROM. Если планируется назначить таблице алиас в условии FROM, то этот алиас следует использовать при уточнении имен столбцов в условии SELECT.

Переформулируем запрос из нашего примера и используем корреляционные имена, просто чтобы увидеть, как это выглядит. R будет корреляционным именем для таблицы Recipes, а RC - для таблицы Recipe Classes.



1 ... 70 71 72 [ 73 ] 74 75 76 ... 152

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