2015-02-27 3 views
1

Что разница междуSQL разница между> = All и MAX

Заявление 1:

SELECT continent, name, area FROM world x 
    WHERE x.area >= ALL 
    (SELECT y.area FROM world y 
    WHERE y.continent=x.continent) 

Заявление 2:

SELECT continent,name,area FROM world x 
WHERE x.area =(SELECT MAX(y.area) FROM world y 
WHERE y.continent=x.continent) 

Это, кажется, дает мне разные результаты, как показано ниже.

Для утверждения 1: http://s8.postimg.org/6t8588cz9/ss1.jpg

Для утверждения 2: http://s4.postimg.org/5lfo10xul/ss2.jpg

Не> = ALL логически эквивалентно SELECT MAX()?

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

+0

Это копировальный или паспорт? Что значит «разные результаты»? –

+0

Второй оператор, который использует MAX, возвращает надмножество первого оператора. (Больше результатов по сравнению с первым утверждением) Я не могу понять, почему это так. – hotguy23

+0

Это не имеет никакого смысла. Второе утверждение должно возвращать * подмножество * первого, потому что вы включаете только строки, равные наибольшей площади (в отличие от большего или равного). Можете ли вы воспроизвести это поведение в [SQL Fiddle] (http://sqlfiddle.com)? –

ответ

3

Проблема с этим конкретным набором данных является то, что некоторые из континентов, как «Африка» и «Европа» имеют нулевые данные для области (Например, Нидерланды в Европе)

Добавить область> 0 на ваш первый вопрос, и вы должен видеть тот же результат

SELECT continent, name, area FROM world x 
    WHERE x.area >= ALL 
    (SELECT y.area FROM world y 
    WHERE y.continent=x.continent and area>0) 
+0

Извините, что я имел в виду. Исправлено, спасибо! – Slartibartfast

+0

Я думаю, что это население :) – Slartibartfast

+0

Упс! Полностью пропущено это, из-за заполнения SQL по умолчанию для выбора по населению. :) Ты прав. – hvd

2

Важным отличием является то, что

x = (select max(y) ...) 

будет только справедливо, когда x является точно равно максимальному y, так x должны быть найдены в y, но

x >= all (select y ...) 

будет true для любое значение значения x больше (или равно) всех значений o f y, поэтому x может быть не найдено в y.

+0

Вопрос имеет тот же столбец для 'x' и для' y', поэтому это не должно меняться. – hvd