|
Программирование >> Исключение дубликатов строк
Ingredients 1 IngredientfD j IngredtentName I IngredienlClassID FK I MeasureAmounllD FK Measurements MeasureAmountID P/C MeasurementDescription Recipe Ingredients! RectpelD RecipeSeqNo IngredienflD MeasureAmounllD Amount PK PK FK FK Recipes I RecipeTitle г.....Oj RecipeClassID I j Preparatw I i Notes Recipe Classes i RecipeClassID PK RecipeCiassDescription Рис. 8.6. Таблицы из учебной базы данных Рецепты , необходимые для извлечения всей информации о рецептах Если СУБД обладает очень интеллектуальным оптимизатором, то запрос, определенный таким способом, должен выполняться настолько же быстро, насколько предыдуш,ий пример, где фильтр на Class Description (Описание вида) был наложен посредством условия WHERE после JOIN. Можно подумать, что СУБД вначале должна отфильтровать строки из Recipe Classes, прежде чем пытаться искать какие-либо строки, удовлетворяюш,ие условиям, в Recipes. Процесс, при котором вначале соединяются все строки из Recipe Classes со строками из Recipes, удовлетворяющими условиям, а затем применяется фильтр, может выполняться намного медленнее. Если выполнение этого запроса займет намного больпле времени, чем следует, перемеш,ение условия WHERE в оператор SELECT в пределах JOIN может заставить систему БД выполнить вначале фильтрацию на Recipe Classes. Вложение опероции JOIN в опероции JOIN Множество задач можно решить, просто связывая две таблицы, однако часто требуется связать три, четыре или более таблиц, чтобы получить все необходимые данные. Например, может потребоваться извлечь всю суш.ественную информацию о рецептах тип рецепта, имя рецепта и все ингредиенты этого рецепта - в одном запросе. На рис. 8.6 представлены таблицы, необходимые для ответа на этот запрос. Похоже, что требуется извлечь данные из пяти различных таблиц! Отбросьте страх - это можно сделать, построив более сложное условие FROM, вкладывая условия JOIN в условия JOIN. Фокус вот в чем: везде, где можно определить имя таблицы, можно определить полное условие JOIN, заключенное в скобки. Рис. 8.7 является упрош,енным вариантом рис. 8.3 (для организации простого соединения двух таблиц вместо условий с корреляционными именами было выбрано условие ON). Для добавления третьей таблицы к соединению просто поместите открывающую скобку перед именем первой таблицы, добавьте закрывающую скобку после условия поиска и вставьте INNER JOIN, имя таблицы, ключевое слово ON и еще одно условие поиска. На рис. 8.8 показано, как это сделать. INNER JOIN двух таблиц, заключенное в скобки, образует логическую таблицу или внутренний набор результатов. Этот набор теперь занимает место имени DISTINCT 2р-Типитрованно0 выражение FROM имялоблицы rм-rw i; r иr♦x-м м*5 <;<wи> €.i<rt< гwwi l INNER JOIN имятаблицы >fc05fe поиска Рис. 8.7. Простое условие INNER JOIN двух таблиц первой простой таблицы на рис. 8.7. Можно продолжить этот процесс заключения полного условия JOIN в скобки, а затем добавления другого ключевого условия JOIN, имени таблицы, ключевого слова ON и условия поиска до тех пор, пока не будут получены все необходимые наборы результатов. Составим запрос, для которого необходимы данные из всех таблиц, представленных на рис. 8.6, и посмотрим, какой будет результат. о- SELECT : , DISTINCT Типизированное выражение l1liSli>tf>>>!t#!illijlfclW FROM имялоблицы INNER JOIN JOIN INNER имя таблицы Условие поиска имя таблйцы Условие поиска Рис. 8.8. Простое условие INNER JOIN трех таблиц 7 need Йе recipe type, recipe name, preparation instructions, ingredient names, ingredient step number, ingredient quantities, and ingredient measurements 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 joined with the recipes table on recipe class ID, then joined with the recipe ingredients table on recipe ID, then joined with the ingredients table on ingredient ID, and then finally joined with the measurements table on measurement amount ID, order by recipe title and recipe sequence number (Выбрать описание вида рецепта, заголовок рецепта, инструкции по приготовлению, название компонента, порядковый номер рецепта, количество и описание единиц измерения из таблицы Виды рецептов , соединенной с таблицей Рецепты по идентификатору вида рецепта, затем соединенной с таблицей Компоненты рецепта по идентификатору рецепта, затем соединенной с таблицей Компоненты по идентификатору компонента, и затем, наконец, соединенной с таблицей Единицы измерения по идентификатору единиц измерения количества, упорядоченные по заголовку рецепта и порядковому номеру рецепта) Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, dfte measurement description from the recipe classes table joined with the recipes table on recipe class ID, theft joined with the recipe ingredients table on recipe ID, then joined with the ingredients table on ingredient ID, and then finally joined with the measurements table on measurement amount ID, order by recipe title ane recipe sequence number (Выбрать описание вида рецепта, заголовок рецепта, приготовление, название компонента, порядковый номер рецепта, количество, описание единиц измерения из Виды рецептов , соединенной с Рецепты по идентификатору вида рецепта, соединенной
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |