|
Программирование >> Исключение дубликатов строк
с Компоненты рецепта по идентификатору рецепта, соединенной с Компоненты по идентификатору компонента, соединенной с Единицы измерения по идентификатору единиц измерения количества, упорядоченные по заголовку рецепта, порядковому номеру рецепта) SQL SELECT Recipe Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, RecipeIngredients.RecipeSeqNo, RecipeIngredients.Amount, Measu rements.Measu rementDesc ription FROM (((Recipe Classes INNER JOIN Recipes ON Recipe Classes.RecipeClassID = Recipes.RecipeClassID) INNER JOIN RecipeIngredients ON Recipes.RecipelD = RecipeIngredients.RecipelD) INNER JOIN Ingredients ON Ingredients.IngredientID = RecipeIngredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe Ing redients.Measu reAmountID ORDER BY RecipeTitle.RecipeSeqNo Здорово! Кто-нибудь испытывает желание влезть в это и добавить фильтр для вида рецептов Основные блюда ? Если вы скажете, что необходимо добавить условие WHERE непосредственно перед условием ORDER BY, вы отгадали самый легкий способ сделать это. Действительно, можно заменить взятый в целом JOIN двух таблиц в любом месте, где можно поместить просто имя таблицы. На рис. 8.8 подразумевалось, что вначале нужно соединить первую таблииу со второй, а затем полученный результат соединить с третьей таблицей. Также можно вначале соединить вторую и третью таблицы (если третья таблица фактически не связана ни со второй, ни с первой), а затем выполнить окончательное соединение с первой таблицей. На рис. 8.9 представлен этот альтернативный метод. Давайте рассмотрим задачу с точки зрения живописи. При попытке получить нежно-зеленый цвет последовательность смешивания не имеет значения. Можно смешать белый цвет с синим, чтобы получить голубой, а затем добавить немного желтого. Или можно смешать синий цвет с желтым, чтобы получить зеленый, а затем добавить немного белого. о- SELECT ЛЛ ШЛ Bbfb ШкЛ ЬЛ DISTINCT --. Типизированное выражение FROM имятоблицы < INNER JOIN - имятоблицы Условие поиска JOIN имятоблицы Условие поиска Рис. 8.9. Соединение более чем двух таблиц в альтернативной последовательности Для составления только что представленного запроса с использованием пяти таблиц можно также записать в SQL следующее: SQL SELECT RecipeClasses.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe Ingredients.RecipeSeqNo, Recipe.Ing redients.Amount, Measu rements.Measu rementDesc ription FROM RecipeClasses INNER JOIN (((Recipes INNER JOIN RecipeIngredients ON Recipes.RecipelD = Recipe Ingredients.RecipelD) INNER JOIN Ingredients ON Ingredients. IngredientID = Recipe Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe Ing redients.Measu reAmountID) ON RecipeClasses.RecipeClassID = Recipes.RecipeClassID ORDER BY RecipeTitle, RecipeSeqNo Необходимо учитывать эту возможность, потому что можно встретить такой тип конструкции либо в запросах, написанных другими, либо в SQL, сконструированных в программном обеспечении построения запросов по образцу. Также оптимизаторы некоторых БД чувствительны к последовательности определения условий JOIN. Если выполнение запроса с использованием многих соединений окажется слишком продолжительным для больших баз данных, можно заставить его выполняться быстрее, изменив последовательность операций JOIN в операторе SQL. Позже в данной главе мы покажем такие примеры с использованием непосредственного расположения соединений слева направо. Проверните такие отношении! Понимание отношений (связей) между таблицами исключительно важно. Когда столбцы нужных данных размешаются в разных таблицах, вероятно потребуется построить условие FROM такой сложности, как только что представленное, обеспечивая возможность сбора вместе всех частей способом, имеюш,им смысл. Если связь между таблицами и связываюшие столбцы, которые устанавливают отношение, неизвестны, то вы ставите себя в безвыходное положение! Во многих случаях для получения нужных данных необходимо последовательно пройти несколько отношений. Для примера упростим предыдуш,ий запрос и попробуем получить только наименование рецепта и названия компонентов: Show те the names of all my recipes and the names of all the ingredients for each of those recipes . C*Показать названия всех рецептов и названия всех компонентов для каждого из этих рецептов ,) Преобразование: Select the recipe title and the ingredient name from the recipes table joined with the recipe ingredients table on recipe ID, and then joined with the ingredients table on ingredient ID (Выбрать заголовок рецепта и название компонента из таблицы Рецепты , соединенной с таблицей Компоненты рецепта по идентификатору рецепта, а затем соединенной с таблицей Компоненты по идентификатору компонента) Уточнение: Select the recipe title and the ingredient name from the recipes table joined with the recipe ingredients table on recipe ID, and then joined with the ingredients table on ingredient ID (Выбрать заголовок рецепта, название компонента из Рецепты , соединенной с Компоненты рецепта по идентификатору рецепта, соединенной с Компоненты по идентификатору компонента) SQL SELECT Recipes.RecipeTitle, Ingredients.IngredientName FROM (Recipes INNER JOIN Recipe Ingredients
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |