Pomóż mi zrozumieć: w samouczku sqlzoo dla pytania 3a ("Znajdź największy kraj w każdym regionie"), dlaczego dołączenie "ORAZ populacja> 0" do zagnieżdżonej instrukcji SELECT czyni to poprawnie?SQL: Nadmiarowa klauzula WHERE określająca kolumnę to> 0?
Odpowiedz
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
Nie, nie jest. Największy kraj ma a priori niezerową populację.
To jak sprawdzanie, czy w największej książce znajdują się jakieś strony.
myślę, że to chodzi o pytanie @ chomika - ta część klauzuli jest w przykładzie podanym na stronie SQLzoo – sasfrog
Również zapytanie zwraca inne wyniki, jeśli pominięto klauzulę "> 0". –
Tak, wygląda na to, że Rosja bez tego zniknie. Nie mogę zrozumieć, dlaczego tak się mogło dziać. – Hamster
OH, więc Europa jest jedynym regionem, który ma NIETNE wartości populacji. Rozumiem. – Hamster
@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. –
Czy jest również dostępna opcja NOT NULL? Mógłoby to mieć o wiele więcej sensu. – Hamster