2017-02-14 16 views
7
SELECT c.cname 
FROM Customers c 
WHERE c.age > ALL (SELECT c2.age 
FROM Customers c2 
WHERE c2.type = 'snowboard'); 

SELECT c.cname 
FROM Customers c 
WHERE c.age > (SELECT MAX(c2.age) 
FROM Customers c2 
WHERE c2.type = 'snowboard') 

Chúng trông giống như tôi vì MAX (c2.age) lớn hơn hoặc bằng tất cả các giá trị trong độ tuổi cột và nếu c.age lớn hơn MAX (c2.age) thì nó lớn hơn tất cả giá trị.Tại sao các truy vấn SQL sau không tương đương?

+1

Vui lòng gắn thẻ dbms – McNets

Trả lời

10

Nếu không có kết quả phù hợp cho snowboard, thì đầu tiên trả về tất cả các hàng và hàng thứ hai không trả về giá trị nào.

Logic đầu tiên tuân theo định nghĩa thông tục của "tất cả". Nếu không có kết quả phù hợp, thì bất kỳ giá trị nào lớn hơn giá trị (không tồn tại) từ truy vấn phụ. Lưu ý: điều này thậm chí còn đúng với NULL (ít nhất là trong SQL Server).

Truy vấn thứ hai trả về NULL khi không có kết quả phù hợp. Về cơ bản, so sánh với NULL không bao giờ trở lại đúng - tốt, có một vài ngoại lệ.

Gợi ý cho tương lai: nếu hai truy vấn trông giống như họ đều giống nhau, nhưng không trở về cùng một giá trị, sau đó một trong hai điều thường là thủ phạm:

  • NULL giá trị có liên quan đến
  • Một trong các bảng trống
+0

Ohhhh lol, đã nhận. Tôi có một sai lầm trong trung hạn. Tôi nghĩ rằng việc phát hiện lỗ hổng của câu hỏi đó là rất khó đối với những sinh viên đã học SQL trong 1 tháng. – daniel

+0

Để xây dựng trên yêu cầu của bạn, bất kỳ so sánh nào với NULL trả về giá trị UNKNOWN vì SQL sử dụng một logic ba giá trị. – daniel

+0

@daniel. . . .Đúng rồi. Rõ ràng, mặc dù, 'NULL' lớn hơn giá trị không tồn tại. Tò mò, vì 'NULL> NULL' đánh giá thành' NULL'. –

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