loading..
Русский    English
05:22
листать

Пересечение и разность стр. 2

Пример 5.7.4

Найти корабли из таблицы Outcomes, которые отсутствуют в таблице Ships.

Задача легко решается при помощи оператора EXCEPT:

Консоль
Выполнить
  1. SELECT ship FROM Outcomes
  2. EXCEPT
  3. SELECT name FROM Ships;

Операция разности не является коммутативной, поэтому если переставить местами запросы, то мы получим решение совсем другой задачи:

"Найти корабли из таблицы Ships, которые отсутствуют в таблице Outcomes".

Эта задача на языке предметной области звучит так:  "Найти корабли, которые не принимали участие в сражениях".

Заметим, что если какой-либо корабль принимал участие в сражениях несколько раз, то по причине исключения дубликатов он будет присутствовать только один раз в результирующем наборе. У нас есть такой корабль - California, но он присутствует также и в таблице Ships, а потому не выводится рассмотренным выше запросом. Поэтому, чтобы продемонстрировать сказанное, исключим его из результатов второго запроса в операции разности:

Консоль
Выполнить
  1. SELECT ship FROM Outcomes
  2. EXCEPT
  3. SELECT name FROM Ships WHERE name <> 'California';

ship
Bismarck
California
Duke of York
Fuso
Hood
King George V
Prince of Wales
Rodney
Schamhorst
West Virginia
Yamashiro

Для имеющегося набора данных тот же результат мы получим при выполнении следующего запроса:

Консоль
Выполнить
  1. SELECT ship FROM Outcomes
  2. EXCEPT ALL
  3. SELECT name FROM Ships;
(2 дубликата для 'California' в таблице Outcomes минус 1 - в Ships)

Соответственно, запрос

Консоль
Выполнить
  1. SELECT ship FROM Outcomes
  2. EXCEPT ALL
  3. SELECT name FROM Ships WHERE name<>'California';
даст нам два вхождения корабля 'California'  в результирующем наборе (2 - 0 = 2):

ship
Bismarck
California
California
Duke of York
Fuso
Hood
King George V
Prince of Wales
Rodney
Schamhorst
West Virginia
Yamashiro

Рекомендуемые упражнения8, 80

Страницы: 1 2 3
Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100