|
Программирование >> Исключение дубликатов строк
Для того чтобы составить только что представленный запрос с использованием пяти таблиц, можно также записать следуюпдий оператор SQL: SQL SELECT Recipe Classes.RecipeClassDescnption, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, RecipeIngredients.RecipeSeqNo, Recipe.Ingredients.Amount, Measu rements.Measu rementDesc ription FROM Recipe.Classes LEFT OUTER JOIN (((Recipes INNER JOIN Recipe.Ingredients ON Recipes.RecipelD = Recipe.Ingredients.RecipelD) INNER JOIN Ingredients ON Ingredients.IngredientlD = Recipe.Ing redients.Ing redientlD) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe Ing redients.Measu reAmountlD) ON Recipe.Classes.RecipeClassID = Recipes.RecipeClassID ORDER BY RecipeTitle,RecipeSeqNo Помните, что оптимизаторы некоторых баз данных чувствительны к последовательности определения условий JOIN. Если выполнение запроса с использованием многих операций JOIN занимает много времени для больших баз данных, можно заставить его выполняться быстрее, изменив последовательность операций JOIN в операторе SQL. В предыдупдих примерах с несколькими соединениями использовалось только одно условие OUTER JOIN. Посмотрим, возможно ли и имеет ли смысл использование более одного OUTER JOIN в сложных JOIN. Предположим, что имеются не только некоторые Recipe Classes, для которых отсутствуют сопоставленные им строки в Recipes, но также есть рецепты, для которых пока еш,е не определены компоненты. В предыдушем примере не было ни одной строки из таблицы Recipes, для которой не было бы сопоставления в таблице Recipe Ingredients, потому что INNER JOIN их исключает. Запросим также все рецепты: 7 need all of the recipe types, and then all of the recipe names, preparations, and instructions, and then any matching 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 left 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 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, afte measurement description from the recipe classes table left outer joined with the recipes table on recipe class ID, then left outer joined with the recipe ingredients table on recipe ID, theft joined with the ingredients table on ingredient ID, and then finally joined with the measurements table on measurement amount ID, order by recipe title ш6 recipe sequence number (Выбрать описание вида рецепта, заголовок рецепта, приготовление, название компонента, порядковый номер рецепта, количество, описание единиц измерения из Виды рецепта с левым внешним соединением с Рецепты по идентификатору рецепта, с левым внешним соединением с Компоненты рецепта по идентификатору рецепта, соединенной с Компоненты по идентификатору компонента, соединенной с Единицы измерения по идентификатору единиц измерения количества, упорядоченные по заголовку рецепта, порядковому номеру рецепта) SQL SELECT RecipeClasses.RecipeClassDescription, Recipes.RecipeTitle.Recipes.Preparation, Ingredients.IngredientName, Recipe.Ingredients.RecipeSeqNo, Recipe.Ingredients.Amount, Measu rements.Measu rementDesc ription FROM (((Recipe.Classes LEFT OUTER JOIN Recipes ON Recipe Classes.RecipeClassID = Recipes.RecipeClassID) LEFT OUTER JOIN Recipe.Ingredients ON Recipes.RecipelD = Recipe.Ingredients.RecipelD) INNER JOIN Ingredients ON Ingredients.IngredientlD = Recipe.Ingredients.IngredientlD) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe.Ing redients.Measu reAmountlD ORDER BY RecipeTitle, RecipeSeqNo Будьте осторожны! Эта разновидность многократного OUTER JOIN работает, только если соблюдается путь для отношения один-ко-многим. Рассмотрим отношения между Recipe Classes, Recipes и Recipe Ingredients, показанные на рис. 9.11. RecipeClasses RecJpeClasstD РК RecipeCiassDescriplion
Recipe Ingredients y. У 1 V. > * * 4 It * * * i% .* >>*i,>t-t)a> > RecipelD RecipeSeqNo PK tngredtentlD FK MeasureAmountID FK Amount Рис. 9.11. Отношения между таблицами Recipe Clnsses, Recipes и Recipe lngredients Здесь представлено отношение один-ко-многим, иногда называемое отношением родитель-потомок . Кавдая строка родитель (с одной стороны отношения) может иметь несколько потомков или не иметь их вовсе (с другой стороны отношения). Если только нет зависших строк ( сирот ) со стороны многие (например, строка в таблице Рецепты со значением Null в своем столбце RecipeClassID), то каждая строка в таблице потомок должна иметь сопоставленную ей строку в родитель-таблице. Поэтому имеет смысл использовать Recipe Classes LEFT JOIN Recipes для выбора всех родительских строк в Recipe Classes, у которых пока еще отсутствует потомок в Recipes. Recipe Classes RIGHT JOIN Recipes даст (за исключением всех зависших строк) тот же результат, что и INNER JOIN. скои
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |