Когда использовать пересечение в запросе

Я немного смущен, когда я должен использовать пересечение в sql. Пример, который мне дают, следующий:

У меня есть две таблицы:

 MovieStar(name, address, gender, birthdate)
 MovieExec(name, address, cert#, netWorth)

В примере предлагается найти имя и адрес всех женщин-актеров, которые также являются исполнителями фильмов и имеют чистоту более 10000000. Решение примера в книге заключается в следующем:

(SELECT name, address
 FROM MovieStar
 WHERE gender = 'F')
   INTERSECT
 (SELECT name, address
  FROM MovieExec
  WHERE netWorth > 10000000);

Поэтому моя проблема в том, почему я должен использовать INTERSECT, тогда как я мог бы использовать оператор "И", например:

SELECT name, address
FROM MovieStar, MovieExec
WHERE gender = 'F' AND netWorth > 10000000

Есть ли какой-нибудь хитрый способ выяснить, когда лучше использовать INTERSECT или "И"?

1 ответ

Решение

Использование INTERSECT когда вас это устраивает и вы получаете правильные результаты. Во-вторых, всегда сравнивайте план выполнения и статистику, потому что способ, которым вы получаете результат, может отличаться.

SqlFiddleDemo

1)

 SELECT name, address
 FROM MovieStar
 WHERE gender = 'F'
 INTERSECT
 SELECT name, address
 FROM MovieExec
 WHERE netWorth > 10000000;

Это означает взять имя и адреса из MovieStar, где пол - "F", взять имя и адрес из MovieExec, где networth > 100000, и найти записи, которые находятся в обоих наборах.

2)

SELECT ms.name, ms.address
FROM MovieStar AS ms, MovieExec AS me
WHERE gender = 'F' AND netWorth > 10000000

Это означает, что вы генерируете CROSS JOIN Декартово произведение (записи MxN), а затем берут только записи, где пол = 'F' И СЕТЬ> 10000000

Я предполагаю, что первый подход вернет результат быстрее и использует меньше памяти (но Query Optimizer может многое сделать).

Когда вы должны использовать INTERSECT:

  • Вы хотите получить пересечение обоих множеств, и вы не можете присоединиться к ним явно
Другие вопросы по тегам