2015-07-13 4 views
0

Учитывая эту базу данных схему:SQL: Есть ли разница между этими двумя запросами

enter image description here

Есть ли разница между следующими двумя запросами:

SELECT NAME, MIN(MOVIEYEAR - YEAR(BIRTHDATE)) AS DEBUT_AGE 
FROM STARSIN 
JOIN MOVIESTAR ON STARNAME = NAME 
GROUP BY NAME; 

SELECT NAME, MOVIEYEAR - YEAR(BIRTHDATE) AS DEBUT_AGE 
FROM MOVIESTAR 
LEFT JOIN STARSIN ON NAME = STARNAME 
WHERE MOVIEYEAR IS NOT NULL 
GROUP BY NAME 
HAVING MIN(MOVIEYEAR); 

Я думаю, что они вернутся тот же результат, я ошибаюсь?

+3

Второй не должен компилироваться - вам нужно что-то после того, как «HAVING MIN (MOVIEYEAR) 'like' HAVING MIN (MOVIEYEAR) = '2010'' –

+0

Почему бы вам не запустить их и посмотреть, какой результат или план выполнения он генерирует? – Rahul

+0

Вы пытались запустить оба, чтобы посмотреть, вернут ли они те же результаты? Какой смысл превращать «INNER JOIN» в «LEFT JOIN» с нулевой проверкой? –

ответ

0

Ваше условие HAVING во втором случае является неполным. Вторая строка также пропускает любую строку, где Movieyear имеет значение NULL, которое не обрабатывается первым (конечно, это может быть избыточным в зависимости от того, является ли Movieyear Nullable)

+0

Movieyear не имеет значения NULL, потому что это часть первичного ключа, поэтому, я думаю, оба запроса будут пропускать строки, где Movieyear может быть нулевым. –

+0

Да, тогда нет необходимости в WHERE MovieYear IS NOT NULL. – GaGa

+0

Как насчет второго условия HAVING, что вы хотели этого сделать? – GaGa

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