it-swarm.com.de

Wie schreibe ich eine vollständige Outer Join-Abfrage in Access

Ursprüngliche Abfrage:

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

Wie konvertiere ich die obige Abfrage, um sie in Microsoft Access kompatibel zu machen?

Ich nehme an:

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

Ich habe mich noch nicht mit den "VOLL" -Kriterien befasst. Konvertiere ich die erste Abfrage korrekt in eine mit Access kompatible Abfrage?

26
user2924488

Angenommen, es gibt keine doppelten Zeilen in AA und BB (d. H. Alle gleichen Werte), entspricht eine vollständige äußere Verknüpfung der Vereinigung einer linken und einer rechten Verknüpfung.

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 gibt (und Sie diese behalten möchten), fügen Sie am Ende WHERE AA.C_ID IS NULL Oder ein anderes Feld hinzu, das nur null ist, wenn es keinen entsprechenden Datensatz von AA gibt.

BEARBEITEN:

Siehe einen ähnlichen Ansatz hier .

Es empfiehlt die ausführlichere, aber performantere

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 jedoch voraus, dass AA.C_ID Und BB.C_ID Nicht null sind.

31
Paul Draper

Der effizientere und schnellere 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
8
user6012447

Ich habe festgestellt, dass die Feldnamen, wenn sie in beiden Tabellen identisch sind, einzeln aufgeführt werden müssen, anstatt den Operator * zu verwenden. Außerdem muss die zweite SELECT-Anweisung auf die andere Tabelle verweisen. Die einfache Verwendung des gleichen SQL-Codes wie der erste und die Änderung in einen RIGHT JOIN-Code ermöglichen nicht die Aufnahme der Zeilen in die BB-Tabelle.

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;
1
Casey35