Программирование >>  Исключение дубликатов строк 

1 ... 138 139 140 [ 141 ] 142 143 144 ... 152


Преобразование:

Уточнение

Select the entertainer stage name and the count of members from the entertainers table joined 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 , grouped by entertainer stage name, and having the count of the members greater than 3

(Выбрать псевдоним эстрадного артиста и количество участников из таблицы Эстрадные артисты , соединенной с таблицей Участники эстрадной группы по идентификатору эстрадного артиста, где идентификатор эстрадного артиста находится в выборке идентификаторов эстрадных артистов из таблицы Стили эстрадных артистов , соединенной с таблицей Музыкальные стили

по идентификатору стиля, где название стиля

Джаз ,

сгруппированные по псевдониму эстрадного артиста и имеющие количество участников больше 3)

Select the entertainer stage name and the count(*) of members as CountOfMembers from the entertainers table joined with the entertainer members table on entertainer ID where the entertainer ID ts in the (selection of entertainer IDs from the entertainer styles table joined with the musical styles table on style ID where the style name ts = Jazz ), grouped by entertainer stage name, and having the count(*) of the members greater than > 3

(Выбрать псевдоним эстрадного артиста, count(*) как CountOfMembers из Эстрадные артисты , соединенной с Участники эстрадной группы по идентификатору эстрадного артиста, где идентификатор эстрадного артиста (выбрать идентификаторы эстрадного артиста из Стили эстрадных артистов , соединенной с Музыкальный стиль по идентификатору стиля, где название стиля = Джаз ), сгруппированные по псевдониму эстрадного apTHtTa и count(*) > 3)

SELECT Entertainers.EntStageName,

COUNT(*) AS CountOfMembers FROM Entertainers INNER JOIN Entertainer.Members ON Entertainers.EntertainerlD =

EntertainerMembers.EntertainerlD WHERE Entertainers.EntertainerlD



(SELECT Entertainer.Styles.EntertainerlD FROM Entertainer.Styles INNER JOIN Musical.Styles. ON Entertainer.Styles.StylelD =

Musical Styles.StylelD WHERE Musical.Styles.StyleName = Jazz) GROUP BY Entertainers.EntStageName

HAVING COUNT(*) > 3

Хотя count (подсчет) был включен в окончательный вывод запроса, совсем не обязательно было это делать, чтобы запросить COUNT(*) в условии HAVING. До тех пор, пока какое-либо вычисленное значение или ссылка на столбец, исполь-.уемые в условии HAVING, могут быть получены из сгруппированных строк, все хорошо. Приведенный выше запрос сохранен в учебной базе данных Entertainment Agency (База данных агентства эстрадных мероприятий) как Jazz Entertainers More Than 3.

фильтры: Почувствуйте розницу

Теперь вам известны два способа фильтрации окончательного набора результатов: WHERE и HAVING. Также известно, что сушествуют определенные ограничения на предикаты, которые можно использовать в условии поиска условия HAVING. Однако в некоторых случаях можно поместить предикат в любое из условий. Рассмотрим доводы в пользу помеш,ения фильтра в условие WHERE вместо условия HAVING.

Размещать ли фильтр а услонии ШН€А€ или а HAVING?

Для фильтрации строк, возвращенных условием FROM запроса, можно построить пять основных типов предикатов: сравнение (=, о, >=, < = ), диапазон (BETWEEN), принадлежность множеству (IN), совпадение с образцом (LIKE) и Null (IS NULL). В главе 11 ваш кругозор был расширен и вы узнали, как использовать подзапрос в качестве одного из аргументов в предикатах сравнения и принадлежности множеству. Были также представлены два дополнительных класса предикатов - количественные (ANY, SOME, ALL) и предикаты существования (EXISTS),- которые требуют подзапроса как одного из аргументов.

Помните, что условие поиска в условии WHERE фильтрует строки до того, как СУБД объединит их в группы. В общем случае, когда нужно объединить в группу только подмножество строк, лучше вначале исключить ненужные строки в условии WHERE. Предположим, требуется решить следующую задачу:

Show те the states on the west coast of the U.S, where the total of the orders is greater than $1 million .

( Показать штаты на западном побережье США, для которых общая сумма заказов превышает 1 млн долларов .)



Customers

i г г г г г F к >. > *: * ♦ ♦ ♦: * ♦! * i

CustomerlD PK

CustFirstName

CustLastName

CustStreetAddress

CustCity

CustState

CustZipCode

CustPhoneNumber

>ri> WWH

Orders

у ЧУ i 1. 4 , j. . .f. 4 4 < 4т *

OrderNumber

OrderDate

ShipDate

CustomerlD

EmployeelD

FK FK


OrderDetails

H. ft. II. Й и я

OrderNumber CPK ProductNumber CPK OmteuPrice QuantityOrdered

Рис. 14.3. Таблицы, необходимые для суммирования всех заказов по штату

На рис. 14.3 представлены таблицы, необходимые для решения этой задачи. Этот запрос вполне законно можно записать следуюш,им образом, поместив предикат по штату клиента в условие HAVING:

SQL SELECT Customers.CustState,

SUM(Order Details.QuantityOrdered * Grder.Details.QuotedPrice) AS SumOfOrders FROM (Customers

INNER JOIN Orders

ON Customers.customerlD = Orders.customerlD) INNER JOIN Order.Details

ON Orders.OrderNumber = Order Details.OrderNumber

CROUP BY Customers.CustState HAVING SUM (OrderDetails.QuantityOrdered *

Order.Details.QuotedPrice) > 1000000 AND CustState IN (WA, OR, CA)

Поскольку группирование производится по столбцу для штата, в условии HAVING по этому столбцу жож/о построить предикат, но при этом, возможно, системе баз данных придется проделать больше работы, чем необходимо. Как оказывается, итоговая сумма всех заказов для клиентов из штата Техас (который вовсе не на западном побеоежье) также поевышает 1 млн яоллаоов. Если установить i

штату клиента в условии HAVING, как в приведенном выше примере, то база данных

также

предикат в условии HAVING и сохраняя результат, а затем в конце отбрасывая его, когда выясняется, что группа для штата Техас не нужна.

Если нужно вычислить результат, основанный на группировании по штату клиента, но требуются клиенты только в Вашингтоне, Орегоне и Калифорнии, то лучше отфильтровать по строкам эти три штата с использованием условия WHERE, прежде чем запрашивать выполнение GR01 условие FROM возвратит строки для всех клиентов во всех штатах, и потребуется выполнить дополнительную работу для группирования тех строк, которые совсем не нужны. Вот лучший способ решения этой задачи:



1 ... 138 139 140 [ 141 ] 142 143 144 ... 152

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика