loading..
Русский    English
10:47
листать

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

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

Решение 4.4.4. Внешнее самосоединение

Консоль
Выполнить
  1. SELECT DISTINCT p.maker
  2. FROM Product p LEFT JOIN
  3. Product p1 ON p.maker = p1.maker AND
  4. p1.type = 'Laptop'
  5. WHERE p.type = 'PC' AND
  6.   p1.maker IS NULL;

Левое соединение таблицы Product с собой при условии, что производитель один и тот же, а тип продукции из второй таблицы есть блокнот. Тогда в столбце p1.maker будет находиться NULL, если у поставщика нет моделей портативных компьютеров, что и используется в предикате предложения WHERE наряду с условием, что в той же строке типом продукции является ПК.

Решение 4.4.5. Группировка

Консоль
Выполнить
  1. SELECT maker
  2. FROM (SELECT DISTINCT maker, type
  3. FROM Product
  4. WHERE type IN ('PC', 'Laptop')
  5. ) AS a
  6. GROUP BY maker
  7. HAVING COUNT(*) = 1 AND
  8.   MAX(type) = 'PC';

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

COUNT(*) = 1 — то есть поставщик должен выпускать только один тип продукции из оставшихся (поскольку мы уже отсекли принтеры, то остается либо ПК, либо портативный компьютер);

MAX(type) = 'PC' — этим типом продукции является ПК. Поскольку в предложении HAVING не могут присутствовать ссылки на столбцы без агрегатных функций, то используется MAX(type), хотя с тем же успехом можно было написать и MIN(type).

При таком обилии подходов естественен вопрос об эффективности, то есть какой из представленных запросов будет выполняться быстрее. Лидером здесь, как по числу операций, так и по оценке времени исполнения, является решение 4.4.5. Наихудшие показатели у третьего варианта. Остальные примерно в два раза по времени уступают лидеру.

Примечание:

Оценку времени, а также процедурный план выполнения запроса в текстовом представлении можно получить в Query Analyzer (SQL Server), выполнив сначала команду. SET SHOWPLAN_ALL ON; а затем выполняя интересующие нас запросы. Чтобы вернуться к обычному режиму выполнения запросов, нужно в том же подключении дать команду SET SHOWPLAN_ALL OFF;

Если у вас не установлен  Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server, вы можете получить план выполнения запроса непосредственно на сайте: http://www.sql-ex.ru/perfcon.php.

Вернуться к обсуждению упражнения 8

Решить задачу на SQL-EX.RU


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 Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/LVCNRUB-P24UAH/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.