2012-01-31 25 views
8

Điều kiện tiên quyết: Trong MS Access 2010 tạo ra các bảng sau:MS Access: WHERE-EXISTS-khoản không làm việc trên quan điểm?

CREATE TABLE ATBL(ID INT); 
INSERT INTO ATBL(ID) VALUES (1); 
INSERT INTO ATBL(ID) VALUES (2); 
INSERT INTO ATBL(ID) VALUES (3); 

CREATE TABLE BTBL(ID INT); 
INSERT INTO BTBL(ID) VALUES (1); 
INSERT INTO BTBL(ID) VALUES (2); 

Cũng tạo một cái nhìn gọi BVIEW trong đó sử dụng câu lệnh SELECT như sau:

SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2 

Bây giờ BVIEW nên có các nội dung tương tự như BTBL. Tuy nhiên, hai truy vấn sau sẽ trả lại các kết quả khác nhau:

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BTBL AS B WHERE B.ID=A.ID) 
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BVIEW AS B WHERE B.ID=A.ID) 

Truy vấn đầu tiên trả về hai bản ghi (1 và 2), nhưng truy vấn thứ hai trả về tất cả bản ghi từ ATBL. Có gì sai ở đây? Tui bỏ lỡ điều gì vậy?

+0

FWIW mã của bạn hoạt động như mong đợi trên SQL Server. – onedaywhen

Trả lời

6

Chế độ xem thực sự là câu lệnh SQL SELECT đã lưu. Ít nhất, đây là những gì một cái nhìn lưu trong MS Access là. Và bạn sử dụng cùng một biến bên trong A và B. IMHO, chúng đang bị lẫn lộn. Dòng cuối cùng thực sự trông như

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2) AS B WHERE B.ID=A.ID) 

Cố gắng thay đổi một số tên bên trong, ví dụ:

SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2 

Vì vậy, dòng cuối cùng sẽ trông như

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2) AS B WHERE B.ID=A.ID) 

Vì vậy, như chúng ta thấy ở đây, MS Access thậm chí không biết cách cô lập bí danh!

+0

Ok, lần đầu tiên tôi gặp bạn, bây giờ tôi thấy SQL của bạn, tôi hiểu ý của bạn là gì. Nó đang làm việc bây giờ. Cảm ơn bạn đã làm rõ hành vi này! –

+2

Nó thực sự khủng khiếp, phải không? MS Access thậm chí không biết cách ly biến bên trong! – Gangnus

+0

+1 Chỉ cần rõ ràng, điều này phải được coi là lỗi với công cụ truy cập cơ sở dữ liệu, một triển vọng không đáng kể bao giờ được sửa và cho lý do thông thường là khách hàng có thể dựa vào hành vi (bị hỏng) (và điều quan trọng là để nhớ rằng khách hàng quan trọng nhất của cơ sở dữ liệu Access là nhóm Windows!) – onedaywhen

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