2010-09-21 22 views

Trả lời

2

Lý do là vì:

AND population > 0 

... được lọc ra hàng null cho khu vực "Châu Âu", tên "Vatican", mà làm phức tạp:

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

. ..bởi vì NULL không phải là giá trị, vì vậy, Nga sẽ không được xếp hạng đúng. Toán tử ALL yêu cầu giá trị bạn so sánh lớn hơn hoặc bằng TẤT CẢ các giá trị được trả về từ truy vấn con, điều này không bao giờ có thể xảy ra khi có NULL trong đó.

truy vấn của tôi sẽ đã hoặc:

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

... hoặc, sử dụng lệnh 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 vì vậy Châu Âu là khu vực duy nhất có giá trị dân số NULL. Tôi hiểu rồi. – Hamster

+0

@Hamster: Vâng, nếu không bạn cũng sẽ thấy các khu vực khác bỏ học. Toán tử ALL yêu cầu giá trị bạn so sánh lớn hơn hoặc bằng TẤT CẢ các giá trị được trả về từ truy vấn con, điều này không bao giờ có thể xảy ra khi có NULL trong đó. –

+0

Có tùy chọn NOT NULL nào không? Điều đó sẽ có ý nghĩa hơn nhiều, có thể. – Hamster

0

Không, không. Quốc gia lớn nhất có dân số không phải là người ưu tiên.

Giống như kiểm tra xem một cuốn sách lớn nhất có bất kỳ trang nào trong đó hay không.

+1

Tôi nghĩ rằng đó là điểm của câu hỏi @ Hamster của - một phần của mệnh đề là trong ví dụ được đưa ra trên trang web SQLzoo – sasfrog

+0

Ngoài ra truy vấn trả về các kết quả khác nhau nếu bạn bỏ qua mệnh đề "> 0". –

+0

Có vẻ như Nga bị mất tích mà không có nó. Tôi không thể hiểu tại sao điều đó có thể xảy ra. – Hamster

Các vấn đề liên quan