|
Программирование >> Исключение дубликатов строк
возможно, чтобы узнать, кто из клиентов и сотрудников живут в одном и том же городе или в регионе с одинаковым почтовым индексом. Внимание! Моо/сно применить JOIN к любым столбцам, пригодным для соединения, в двух таблицах, но это не означает, что это обязательно следует делать. Связываемые столбцы должны иметь одинаковые значения данных, чтобы операция JOIN имела смысл. Например, не стоит выполнять ее для Customer Name (Имя клиента) с Employee Address (Ддрес сотрудника), хотя оба столбца имеют символьный тип данных. В наборе результата не будет получено ни одного столбца, если только кто-нибудь не занес по ошибке имя в столбец Employee Address. Также не имеет смысла выполнять JOIN Student ф (Идентификатор студента) с Class ID (Идентификатором курса лекций), хотя они оба являются числами. Возможно, и будут получены какие-либо строки в наборе результатов, но они не будут иметь смысла. Даже когда есть резон соединить в JOIN связываюш,ие столбцы, это может закончиться построением запроса, выполнение которого потребует много времени. Например, запросив операцию JOIN столбцов, для которых, администратор БД не определил индекс, СУБД должна будет проделать большой объем дополнительной работы. Запрашивая JOIN для выражений - например конкатенацию имени и фамилии из двух таблиц,- СУБД должна будет не только сформировать столбец результата из выражения для всех строк, но также и выполнить несколько просмотров всех данных в обеих таблицах, чтобы вернуть правильный результат. Синтаксис Теперь достанем наши палитры, смешаем краски и начнем изучать синтаксис INNER JOIN. DISTINCT FROM имятоблицы Типизированное выражение INNER имятаблицы Условие поиска имястол Рис. 8.1. Диаграмма запроса с использованием INNER JOIN двух таблиц Использование таблиц Начнем с простого - операции INNER JOIN двух таблиц. На рис. 8.1 представлена синтаксическая конструкция для создания запроса. Как можно видеть, условие FROM теперь немного более сложное (условия WHERE и ORDER BY пока исключены для простоты). Вместо одного имени таблицы определяются имена двух таблиц, которые связываются ключевым словом JOIN. Необязательное ключевое слово INNER определяет тип соединения. Если тип нужного соединения не указан явно, то по умолчанию используется тип INNER. Рекомендуем всегда явно указывать тип нужного соединения, чтобы был понятен характер запроса. Внимание! Воспользовавшиеся полной диаграммой синтаксической структуры из приложения А обнаружат, что операция tablename JOIN tablename описана как часть определенного термина соединенные таблицы. Ссылка на таблицы включает соединенные таблицы, а условие FROM оператора SELECT использует ссылку на таблицу. Эти сложные определения были свернуты в одну диаграмму, чтобы облегчить изучение простого соединения двух таблиц. Такой же метод упрош,ения используется в синтаксических диаграммах остальной части данной главы. Необходимой частью INNER JOIN является условие ON или USING, расположенное после имени второй таблицы и указываюш,ее системе базы данных, как выполнять соединение. Для разрешения этого соединения СУБД логически объединяет каждую строку в первой таблице с каждой строкой во второй таблице (это называется декартовым произведением). Затем к ним применяется критерий, указанный в условии ON или USING, чтобы отфильтровать строки, которые должны быть возвраш,ены. В условии ON условие поиска может использоваться внутри JOIN для определения логической проверки, результат которой должен иметь значение True (Истина) для возврашения любых двух связанных строк. Помните, что имеет смысл указывать условие поиска только в том случае, когда по крайней мере один столбец из первой таблицы сравнивается по крайней мере с одним столбцом второй таблицы. Хотя можно записать очень сложное условие поиска, обычно выполняется проверка простого условия равенства по первичному ключу одной таблицы со столбцами внешних ключей второй таблицы. Рассмотрим простой пример. В хорошо спроектированной базе данных следует выделить сложные квалификационные имена во вторую таблииу, а затем связать имена с исходной таблицей предмета через простое значение ключа. Это делается с целью предотврашения ошибок ввода данных. Кто-либо, используюш,ий вашу БД, скорее выберет из списка квалификационных имен, чем введет имя с клавиатуры (и, возможно, с ошибками) в каждой строке. Например, в примере базы данных Рецепты Recipe Classes (Виды рецептов) заносятся в таблииу отдельно от Recipes (Рецепты). На рис. 8.2 показано отношение между Recipe Classes и Recipes. RecipeClasses RecipeClassID ReclpeClassDescrjption Рис. 8.2. Recipes J. . . X . * .1 .1, и ♦ ♦ Ч I. Ч ♦ у ; * - RecipelD RecipeTitle RecipeClassID Preparation Notes Описание видов рецептов и сами рецепты находятся в разных таблицах Когда из БД нужно извлечь информацию о рецептах и соответствующее Recipe Class Description (Описание вида рецепта), не требуется просматривать коды Recipe Class ID (Идентификатор вида рецепта) из таблицы Recipes. Для этого используется JOIN. Внимание! В данной главе используется метод Запрос/Преобразование/Уточнение/SQL , введенный в главе 4. 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 on recipe class ID in the recipe classes table matching recipe class ID in the recipes table (Выбрать название рецепта, приготовление и описание вида рецепта из таблицы Виды рецептов , соединенной с таблицей Рецепты по идентификатору вида рецепта в таблице Виды рецептов , совпадающему с идентификатором вида рецепта в таблице Рецепты ) Select recipe title, preparation, arte recipe class description from the recipe classes table joined with the recipes table on recipe class ID in the recipe classes table matching = recipe class ID in the recipes table (Выбрать название рецепта, приготовление, описание вида рецепта из Виды рецептов , соединенной с Рецепты по идентификатору вида рецепта = идентификатору вида рецепта) SELECT RecipeTitle, Preparation, RecipeClassDesc ription FROM Recipe.Classes INNER JOIN Recipes Уточнение:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |