2013-10-27 13 views
20

truy vấn gốc:Làm thế nào để viết một bên ngoài tham gia truy vấn đầy đủ trong việc tiếp cận

SELECT * 
FROM AA 
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID); 

Làm thế nào để chuyển đổi các truy vấn trên để làm cho nó tương thích trong Microsoft Access?

Tôi giả định:

SELECT * 
FROM AA 
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID); 

tôi đã không xử lý với tiêu chí "ĐẦY ĐỦ" trước khi tôi chuyển đổi một cách chính xác các truy vấn đầu tiên vào một truy vấn tương thích với Access?

Trả lời

26

Giả sử không có hàng trùng lặp trong AA và BB (nghĩa là tất cả các giá trị giống nhau), một phép nối ngoài đầy đủ tương đương với liên kết của phép nối trái và nối phải.

SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
UNION 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 

Nếu có một dòng trùng lặp (và bạn muốn giữ chúng), thêm WHERE AA.C_ID IS NULL vào cuối, hoặc một số lĩnh vực khác mà chỉ là null nếu có được không tương ứng với kỷ lục từ AA.

CHỈNH SỬA:

Xem phương pháp tương tự here.

Nó khuyến cáo các tiết hơn, nhưng hơn performant

SELECT * 
    FROM AA 
     JOIN BB ON AA.C_ID = BB.C_ID 
UNION ALL 
SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE BB.C_ID IS NULL 
UNION ALL 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE AA.C_ID IS NULL 

Tuy nhiên, điều này giả định rằng AA.C_IDBB.C_ID không null.

6

Các eficient hơn và mã nhanh hơn:

SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
UNION ALL 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE AA.C_ID IS NULL 
1

Tôi thấy rằng nếu tên trường đều giống nhau ở cả hai bảng họ sẽ cần phải được liệt kê riêng hơn là sử dụng các nhà điều hành *. Ngoài ra, câu lệnh SELECT thứ hai cần tham khảo bảng khác. Đơn giản chỉ cần sử dụng cùng một SQL như là đầu tiên và thay đổi nó thành một RIGHT JOIN không cho phép bao gồm các hàng trong bảng BB.

SELECT AA.C_ID 
FROM AA 
LEFT JOIN BB ON 
    AA.C_ID = BB.C_ID 
UNION ALL 
SELECT BB.C_ID 
FROM BB 
LEFT JOIN AA ON 
    AA.C_ID = BB.C_ID 
WHERE AA.C_ID IS NULL; 
Các vấn đề liên quan