|
Программирование >> Исключение дубликатов строк
Show те the entertainer groups who play in a jazz style and who have more than three members . ( Показать группы эстрадных артистов, играющих в джазовом стиле и состоящих более чем из трех человек .) Выглядит не слишком сложно, не так ли? На рис. 14.1 представлены таблицы, необходимые для решения этого запроса. MUStCAlSTYLES StylelD StyleName
£ntertainer Members EntertainerlD MemberlD Status CPK CPK EntertainerStyles EntertainerlD StylelD CPK CPK Рис. 14.1. Таблицы, необходимые для отображения эстрадных артистов, исполняющих джаз в составе группы более трех человек Внимание! Снова воспользуемся методом Запрос/Преобразование/ Уточнение/SQL , который первоначально был введен в главе 4. Также используем методы JOIN (см. главы 8 и 9) и подзапросы (см. главу 11) Не зная об условии HAVING, возможно, вас привлечет вариант решения задачи следующим неверным способом: Преобразование: Select the entertainer stage name and the count of members from the entertainers table oined with the entertainer members table on entertainer ID where the entertainer ID is in the selection of entertainer IDs from the entertainer styles table joined with the musical styles table on style ID where the style name is Jazz and where the count of the members is greater than 3, grouped by entertainer stage name (Выбрать псевдоним эстрадного артиста и подсчитать количество участников из таблицы Эстрадные артисты , соединенной с таблицей Участники эстрадной группы по идентификатору эстрадного артиста, где идентификатор эстрадного артиста находится в выборке идентификаторов эстрадных артистов из таблицы Стили эстрадных артистов , соединенной с таблицей Музыкальные стили по идентификатору стиля, где название стиля - Джаз и где количество участников больше трех, сгруппированные по псевдониму эстрадного артиста) Уточнение: Select the entertainer stage name and the count(*) of members as Count of Members from the entertainers table joined with the entertainer members table on entertainer ID where the entertainer ID is in the (selectton-of entertainer IDs from the entertainer styles table joined with the musical styles table on style ID where the style name == Jazz) and where the count(*) of the members is greater than > 3, grouped by entertainer stage name (Выбрать псевдоним эстрадного артиста, подсчитать (*) участников как Count of Members из Эстрадные артисты , соединенной с Участники эстрадной группы по идентификатору эстрадного артиста, где идентификатор эстрадного артиста в (Выбрать идентификатор эстрадного артиста из Стили эстрадных артистов , соединенной с Музыкальные стили по идентификатору стиля, где название стиля = *Jazz) и подсчитать(*) > 3, сгруппированные по псевдониму эстрадного артиста) SQL SELECT Entertainers.EntStageName, COUNT(*) AS CountOfMembers FROM Entertainers INNER JOIN Entertainer Members ON Entertainers.EntertainerlD = Entertainer Members. EntertainerlD WHERE Entertainers.EntertainerlD IN (SELECT Entertainer.Styles.EntertainerlD FROM EntertainerStyles INNER JOIN MusicalStyles ON Entertainer Styles.StyleID = Musical Styles.StylelD WHERE Musical.Styles.StyleName = Jazz) AND COUNT(*) > 3 GROUP BY Entertainers.EntStageName Что же здесь неверно? Разгадка в том, что любой столбец, указанный в условии WHERE (см. главу 6), долоюен быть столбцом в одной из таблиц, определенных в условии FROM. Является ли COUNT(*) столбцом, сгенерированным в условии FROM? Мы так не думаем! Фактически подсчет COUNT для каждой группы можно выполнить только после группирования строк. Похоже, что нам требуется новбе условие после GROUP BY. На рис. 14.2 представлен полный синтаксис оператора SELECT, включая новое условие HAVING. Оператор SEL£CT о- SELECT I- DISTINCT WW <lt w 1w l1ФtФW WWl1я Типтированное - выражение I имялаблицы псевдоним ко р реля ционно еи t<illllfcilitiW4aiH Ссылка на таблицу WHERE Условие поиска L GROUP BY Ссылка HQ стоАбвц HAVING K?>40**f в поиска Рис. 14.2. Оператор SELECT и все его условия Поскольку условие HAVING действует на строки после того, как они были сгруппированы, стандарт SQL устанавливает некоторые ограничения на столбцы, указываемые в любом предикате условия поиска. Обратите внимание, что, когда условие GROUP BY отсутствует, условие HAVING оперирует всеми строками, возвращенными условиями FROM и WHERE, как если бы они были одной группой. Это такие же ограничения, как и для столбцов, указываемых в условии SELECT сгруппированного запроса. Любая ссылка на столбец в предикате внутри условия поиска в HAVING должна либо указать имя столбца, перечисленного в условия GROUP BY, либо должна быть вложена в агрегатную функцию. Это имеет смысл, поскольку любое сравнение столбцов должно использовать что-либо, сгенерированное из сгруппированных строк,- либо группирующее значение, либо составное вычисление по строкам в каждой группе. Запишем решение для приведенной выше задачи правильным способом: Show те the entertainer groups who play in a jazz style and who have more than three members . ( Показать эстрадные группы, исполняющие до/саз и состоящие более чем из трех человек .)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |