PDA

View Full Version : Tại sao ?



hoangnnm
07-03-2011, 21:25
Tôi có 1 thắc mắc nhờ các bạn chỉ giáo giúp .
Ví dụ tôi có đoạn lệnh sau :


select top 10 x from bangx where x in ( select x from bangy )

Thực ra table bangy không hề có trường x, nhưng kết quả trả về vẫn là 10 record cột x.
Nếu tôi chỉ chạy lệnh :


select x from bangy

Lập tức sẽ có lỗi vì table bangy không có x.
Hoặc nếu select 1 cột x1 từ bangy ( x1 không có trong cả table bangx và table bangy ) cũng sẽ gây lỗi :


select top 10 x from bangx where x in ( select x1 from bangy )

Tại sao lại như vậy chứ ?

Ps: Sql2000 , chưa thử trên 2005 ->

vuht2000
07-03-2011, 22:28
2005 và 2008 vẫn bị. Lý do là trong subquery có thể dùng cột từ bảng từ bên ngoài. Như ở trên cột x trong subquery vì không tồn tại trong bangy nên được hiểu là lấy từ bảng bangx và vì thế subquery vẫn valid. Tuy nhiên về mặt ngữ nghĩa thì sai.
Còn khi chuyển thành x1 thì lỗi vì cột x1 không tồn tại trong toàn bộ domain của câu lệnh (cả bangx và bangy)

hoangnnm
08-03-2011, 15:20
Nếu đó là câu trả lời xác đáng nhất thì tôi cũng đã tự hiểu như vậy .
Thanks vuht2000.