Truy vấn là SQL chính xác về mặt cú pháp ngay cả khi table_b
không có name
cột. Lý do là độ phân giải phạm vi.
Khi truy vấn được phân tích cú pháp, đầu tiên nó được kiểm tra xem table_b
có name
cột không. Vì nó không, sau đó table_a
được kiểm tra. Nó sẽ chỉ báo lỗi nếu cả hai bảng không có name
cột.
Cuối cùng, truy vấn được thực hiện như sau:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
Đối với các kết quả mà truy vấn sẽ đưa ra, đối với mỗi hàng table_a
, truy vấn con (select name from table_b)
- hoặc (select a.name from table_b b)
- là một bảng có một cột có cùng a.name
giá trị và có nhiều hàng như table_b
. Vì vậy, nếu table_b
có 1 hàng trở lên, truy vấn sẽ chạy như sau:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
hoặc là:
select a.*
from table_a a
where a.name = a.name ;
hoặc là:
select a.*
from table_a a
where a.name is not null ;
Nếu table_b
trống, truy vấn sẽ không trả về hàng nào (thnx đến @ughai để chỉ khả năng đó).
Điều đó (thực tế là bạn không gặp lỗi) có lẽ là lý do tốt nhất mà tất cả các tham chiếu cột phải được thêm tiền tố với tên bảng / bí danh. Nếu truy vấn là:
select a.* from table_a where a.name in (select b.name from table_b);
bạn sẽ có lỗi ngay lập tức. Khi các tiền tố bảng được bỏ qua, không khó để xảy ra các lỗi như vậy, đặc biệt là trong các truy vấn phức tạp hơn và thậm chí quan trọng hơn, không được chú ý.
Đọc thêm trong các tài liệu của Oracle: Độ phân giải của các tên trong các câu lệnh SQL tĩnh , ví dụ tương tự B-6 trong chụp bên trong và các khuyến nghị trong việc tránh bắt trong trong các đoạn của câu lệnh CHỌN và DML :
Đủ điều kiện mỗi tham chiếu cột trong tuyên bố với bí danh bảng thích hợp.