loading..
Русский    English
15:21
листать

Упражнение 8 (подсказки и решения) стр. 1

Сначала пара «естественных» решений, которые отличаются лишь предикатом, проверяющим отсутствие у поставщика модели портативного компьютера.

Решение 4.4.1. Предикат NOT IN

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product
  3. WHERE type = 'PC' AND
  4.       maker NOT IN (SELECT maker
  5.                     FROM Product
  6.                     WHERE type = 'Laptop'
  7.                     )

Решение 4.4.2. Предикат EXISTS (что обычно для этого предиката, подзапрос является коррелирующим)

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product AS pc_product
  3. WHERE type = 'pc' AND
  4.       NOT EXISTS (SELECT maker
  5.                   FROM Product
  6.                   WHERE type = 'laptop' AND
  7.                         maker = pc_product.maker
  8.                   );

3.    Теперь приведу несколько оригинальных решений.

Решение 4.4.3. Использование коррелирующих запросов с группировкой

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product AS p
  3. WHERE (SELECT COUNT(1)
  4.        FROM Product pt
  5.        WHERE pt.type = 'PC' AND
  6.              pt.maker = p.maker
  7.        ) > 0 AND
  8.       (SELECT COUNT(1)
  9.        FROM Product pt
  10.        WHERE pt.type = 'Laptop' AND
  11.              pt.maker = p.maker
  12.        ) = 0;

В подзапросах проверяется, что число моделей ПК поставщика из основного запроса больше нуля, в то время как число моделей портативных компьютеров этого же поставщика равно нулю.

Следует обратить внимание на аргумент функции COUNT(1). Стандарт определяет два типа аргументов этой функции: «*» и выражение. Применение «*» приводит к подсчету числа строк, отвечающих запросу. Использование выражения дает число строк, для которых выражение имеет значение, то есть не является NULL. В качестве выражения обычно служит имя столбца, поэтому задействование константы может вызвать удивление у тех, кто еще недостаточно хорошо знаком с языком. Поскольку константа (в рассматриваемом запросе 1) не может быть NULL, то такое выражение вполне эквивалентно COUNT(*).


Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.