|
Программирование >> Исключение дубликатов строк
DISTINCT- Ткшзированнов выражение -т FROM имятоблицы корреляционноеимя JOIN - имялофицы V...,---коррвляционнов имя Условие поиска USrNG имястолбца Рис. 8.3. Назначенце корреляционного имени таблице в условии FROM SELECT R.RecipeTitle, R.Preparation, RC. RecipeClassDescription FROM Recipe Classes AS RC INNER JOIN Recipes AS R ON RC.RecipeClassID = R.RecipeClassID Предположим, что нужно добавить фильтр, чтобы получить только рецепты вида Главное блюдо или Десерт (подробнее о фильтрах см. в главе 6). Раз назначено корреляционное имя, то следует продолжить использование этого имени во всех ссылках на таблииу. SQL будет следуюш,им: SQL SELECT R.RecipeTitle, R.Preparation, RC.RecipeClassDescription FROM Recipe.Classes AS RC INNER JOIN Recipes AS R ON RC.RecipeClassID = R.RecipeClassID WHERE RC. RecipeClassDescription = Main course OR RC.RecipeClassDescription = Dessert Совсем не обязательно назначать корреляционные имена всем таблицам. В предыдущем примере можно назначить корреляционное имя только для Recipes или Recipe Classes, но не для обоих. В некоторых случаях необходимо назначить корреляционное имя таблице 3 сложном соединении. Воспользуемся учебной базой данных Лига игры в боулинг .
Рис. 8.4. Отношение между таблицами Teams и Bowlers чтобы исследовать случай, когда это справедливо. На рис. 8.4 показано отношение между таблицами Teams (Команды) и Bowlers (Игроки в боулинг). Как можно видеть, TeamID является внешним ключом в таблице Bowlers, который позволяет отыскивать информацию обо всех игроках команды. Один из игроков является капитаном, поэтому также имеется связь от BowlerlD в таблице Bowlers к CaptainID в таблице Teams. Если нужно получить список с названием команды, именем капитана команды и именами всех игроков в боулинг в одном запросе, то потребуется включить в запрос две копии таблицы Bowlers - одну для связывания с CaptainID для излечения имени капитана команды и другую для связывания по TeamID, чтобы получить список всех участников. В этом случае следует назначить имя-псевдоним одной или обеим копиям таблицы Bowlers, чтобы СУБД могла отличить копию, которая связана с именем капитана, и копию, которая предоставляет список всех участников команды. Позднее в этой главе мы покажем пример, который требует включения нескольких копий одной таблицы и назначения им имен-псевдонимов. Вложение опероторо SCLCCT Сделаем задачу немного более интересной. Вместо того чтобы нанести немного голубого, а затем немного желтого на картину, чтобы получить зеленый, вначале смешаем нужный оттенок зеленого прямо на палитре. В большинстве реализаций SQL можно заменять весь оператор SELECT на любое имя таблицы в условии FROM. Конечно, нужно назначить корреляционное имя, чтобы результат оценки вложенного запроса имел имя. На рис. 8.5 показано, как составить условие JOIN, используя вложенные операторы SELECT. На рисунке оператор SELECT может включать все условия запроса, кроме условия ORDER BY. Также можно смешивать и согласовывать операторы SELECT с именами таблиц по любую сторону ключевых слов INNER JOIN. OrSTINCT Типизированное выражение f FROM Оператор SELECT 1-------X ко p реля Ц и OHHO в и МЯ * .(iil M i*=!>>JJ>w JOIN - Оператор SELECT корреляционноеимя - УЬловие поиска USING -j имястолбца Рис. 8.5. Замена имен таблиц в операторе SELECT на JOIN Еще раз рассмотрим Recipes и Recipe Classes. Наш запрос все еще требует только Главное блюдо и Десерты . Вот снова запрос с таблицей Recipe Classes, отфильтрованной в операторе SELECT, который является частью INNER JOIN: SELECT R.RecipeTitle, R.Preparation, RCFiltered.ClassName FROM (SELECT RecipeClassID, RecipeClassDescription AS ClassName FROM Recipe Classes AS RC WHERE RC.ClassName = Main course OR RC.ClassName = Dessert AS RCFiltered INNER JOIN Recipes AS R ON RCFiltered.RecipeClassID = R.RecipeClassID Ho осторожно! Имеется парочка набрызганных пятен . Вначале, когда принимается решение заменить оператор SELECT на имя таблицы, не забудьте включить не только столбцы, которые желательно увидеть в окончательном результате, но также все связывающие столбцы, необходимые для выполнения JOIN. Именно поэтому во вложенном операторе присутствует как RecipeClassID, так и RecipeClassDescription. Просто ради шутки во вложенном операторе RecipeClassDescription мы присвоили имя-алиас ClassName. В результате условие SELECT запрашивает ClassName вместо RecipeClassDescription. Условие ON теперь ссылается на корреляционное имя вложенного оператора SELECT - RCFiltered - вместо исходного имени таблицы или корреляционного имени, назначенного таблице внутри вложенного оператора SELECT.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |