2013-10-27 15 views
20

Original-Abfrage:Wie schreibe ich eine vollständige Abfrage Outer Join in Zugang

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

Wie konvertiere ich die Abfrage oben, um es in Microsoft Access kompatibel zu machen?

Ich gehe davon aus:

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

Ich habe nicht mit den „FULL“ Kriterien behandelt, bevor ich mich die erste Abfrage in eine Abfrage kompatibel mit Access richtig konvertieren?

Antwort

26

Angenommen, es gibt keine doppelten Zeilen in AA und BB (d. H. Alle die gleichen Werte), ist ein vollständiger äußerer Join der Entsprechung der Vereinigung eines linken Joins und eines rechten Joins.

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 

Wenn es doppelte Zeilen (und Sie wollen, dass sie halten), fügen WHERE AA.C_ID IS NULL am Ende, oder ein anderes Feld, das nur null ist, wenn es nicht Datensatz von AA entspricht.

EDIT:

Siehe einen ähnlichen Ansatz here.

Es empfiehlt die ausführlichere, aber leistungsfähigere

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 

Dies setzt allerdings voraus, dass AA.C_ID und BB.C_ID nicht null sind.

6

Je mehr eficient und schnellerer Code:

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

Ich fand, dass, wenn die Feldnamen das gleiche in beiden Tabellen sind, werden sie einzeln aufgeführt werden müssen, anstatt den * Operator. Außerdem muss die zweite SELECT-Anweisung auf die andere Tabelle verweisen. Wenn Sie einfach dasselbe SQL wie das erste verwenden und es in ein RECHTES JOIN ändern, können die Zeilen in der BB-Tabelle nicht berücksichtigt werden.

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;