2013-06-10 22 views
6

Here Tôi đã đặt câu hỏi về truy vấn không hoạt động.giá trị> = tất cả (chọn v2 ...) tạo ra các kết quả khác nhau từ giá trị = (chọn tối đa (v2) ...)

Vô tình (với sự giúp đỡ của một câu trả lời) Tôi đã tìm ra cách làm cho giải pháp đúng. Vấn đề là tôi không hiểu tại sao họ tạo ra các kết quả khác nhau.

Vì vậy, các cơ sở dữ liệu có schema này:

enter image description here

Và tôi đang tìm kiếm cho tất cả các mô hình từ PC, PrinterLaptop với giá cao nhất . Tất cả các bảng này có thể có cột không độc đáo model, vì các mục có khác nhau code có thể có cùng một kiểu.

giải pháp ban đầu của tôi là:

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price >= all(select price from model_price) 

Nó đã cho kết quả sai - hệ thống trở * Wrong number of records (less by 2).

Các giải pháp khắc phục mà làm việc là thế này:

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price = (select max(price) from model_price) 

Vì vậy, tại sao các giải pháp với all sản xuất kết quả khác nhau?


Về cơ sql: Now we use Microsoft SQL Server 2012 on the rating stages, and MySQL 5.5.11, PostgreSQL 9.0, and Oracle Database 11g on the learn stage in addition. Vì vậy, tôi không biết động cơ họ chính xác sử dụng để lừa bài tập này.

+1

Bất kỳ 'NULL' nào trong dữ liệu? 'select 1 where 1> = ALL (chọn null union select 0)' trả về không có hàng nào. –

+0

Xin lỗi, tôi không biết dữ liệu cho cơ sở dữ liệu thứ hai (điều này được thực hiện cố ý cho những người làm bài tập không ăn gian). Tôi thậm chí không thể thấy kết quả cho các truy vấn trên DB thứ hai, chỉ tóm tắt những gì là sai, ví dụ: '* Số lượng bản ghi sai (ít hơn 2)'. – ovgolovin

Trả lời

5
create table t (f int null); 

select 1 where 1 >= (select max(f) from t); -- 1 
select 1 where 1 >= all(select f from t); -- 2 

insert into t values (null), (0); 

select 1 where 1 >= (select max(f) from t); -- 3 
select 1 where 1 >= all(select f from t); -- 4 

http://www.sqlfiddle.com/#!6/3d1b1/1

Các select lợi nhuận đầu tiên không có gì, thứ hai select lợi nhuận 1.

MAX trả về giá trị vô hướng. Nếu không có hàng nào tồn tại, MAX trả về NULL. 1 >= NULL là không đúng trên dòng 1. Mặt khác, 1 >= all f s là đúng, bởi vì không có f s ở tất cả các điều kiện là không đúng.

Thứ ba select trả về 1, thứ tư select không trả về giá trị nào.

MAX, giống như tất cả các hàm tổng hợp, bỏ qua NULL s. MAX(f) là 0 trên dòng 3 và 1 >= 0 là đúng. ALL không: nó đánh giá 1 >= NULL AND 1 >= 0 trên dòng 4, điều này không đúng.

+0

Lưu ý rằng bạn có thể sử dụng 'ISNULL' (aka' ISNULL (giá, 0) ') nếu bạn muốn sử dụng' ALL' vì một lý do khác. – Guvante

+0

Cảm ơn!Đây có lẽ là bài tập tôi nên học từ nhiệm vụ này! Vì vậy, 'NULL' không được tự động nâng lên' 0' trong khi được so sánh. – ovgolovin

+0

Phải, và nếu có thể cho tất cả các giá trị trường là số âm, việc xử lý 'NULL' là' 0' thậm chí có thể rất sai, do đó, có thể điều tốt là cơ sở dữ liệu không tự động làm điều đó. Điều này có thể có ý nghĩa ngay cả đối với trường "giá", nếu bạn có các bài viết "giảm giá" đặc biệt. – hvd

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