2015-08-31 2 views
0

я немного comfused о том, когда мне придется использовать пересекаются в sql.The примере, что я даюсь является следующее:, когда использовать пересекаются в запросе

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

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

пример просит, чтобы найти имя и адрес всех женщин, актеров, которые также являются кино и исполнитель имеют Networth над 10000000.The раствором, например, в книге следующее:

(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 или «И»?

+0

Знаете ли вы, что 'ОТ Moviestar, MovieExec' является CROSS JOIN (декартово продукт)? – lad2025

+0

Не жаль, у меня нет этой информации. –

+0

Единственным сложным способом является план выполнения и статистика, 2 запроса могут быть эквивалентны в результате, но способ их получения может отличаться. Поэтому всегда сравнивайте план выполнения, время и ресурсы, необходимые для достижения того, чего вы хотите. – lad2025

ответ

3

Используйте 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' И Networth> 10000000

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

Когда следует использовать INTERSECT:

  • вы хотите, чтобы получить пересечение двух множеств, и вы не можете присоединиться к ним явно
+0

Думаю, я понимаю, поэтому с первым решением я бы получил только записи, которые являются как женщинами, так и networth> 1000000, но во втором я получу как отчеты о женщинах, так и записи networth> 10000000.Спасибо! –

+0

@ZisisDiamantis См. Обновленный ответ и пример sqlfiddle. В обоих случаях вы получите женский и networth> 1000000, а во втором вы получите один и тот же ответ несколько раз, так как работает CROSS JOIN, если вы этого не хотите, вам нужно использовать 'SELECT DISTINCT ms.name, ms. address' – lad2025

Смежные вопросы