2010-09-21 7 views

Odpowiedz

2

Powodem jest fakt, że:

AND population > 0 

... jest odfiltrowanie zerowej wiersz dla regionu "Europa" nazwa "Watykańskiego", który komplikuje:

WHERE population >= ALL (SELECT population 
          FROM ...) 

. .. ponieważ NULL nie jest wartością, więc Rosja nie będzie prawidłowo oceniana. Operator ALL wymaga, aby porównywana wartość była większa lub równa wartościom zwróconym przez podzapytanie, które nigdy nie mogą wystąpić, gdy istnieje tam wartość NULL.

Moje zapytanie byłby już albo:

SELECT region, name, population 
    FROM bbc x 
WHERE population = (SELECT MAX(population) 
         FROM bbc y 
         WHERE y.region = x.region) 

... lub za pomocą JOIN:

SELECT x.region, x.name, x.population 
    FROM bbc x 
    JOIN (SELECT y.region, 
       MAX(y.population) AS max_pop 
      FROM bbc y 
     GROUP BY y.region) z ON z.region = x.region 
          AND z.max_pop = x.population 
+0

OH, więc Europa jest jedynym regionem, który ma NIETNE wartości populacji. Rozumiem. – Hamster

+0

@Hamster: Tak, inaczej widzielibyście też, że inne regiony też się wypadają. Operator ALL wymaga, aby porównywana wartość była większa lub równa WSZYSTKIM wartościom zwróconym przez podzapytanie, co nigdy nie może się zdarzyć, gdy istnieje tam wartość NULL. –

+0

Czy jest również dostępna opcja NOT NULL? Mógłoby to mieć o wiele więcej sensu. – Hamster

0

Nie, nie jest. Największy kraj ma a priori niezerową populację.

To jak sprawdzanie, czy w największej książce znajdują się jakieś strony.

+1

myślę, że to chodzi o pytanie @ chomika - ta część klauzuli jest w przykładzie podanym na stronie SQLzoo – sasfrog

+0

Również zapytanie zwraca inne wyniki, jeśli pominięto klauzulę "> 0". –

+0

Tak, wygląda na to, że Rosja bez tego zniknie. Nie mogę zrozumieć, dlaczego tak się mogło dziać. – Hamster