880 Stimmen

Wie kann ich einen FULL OUTER JOIN in MySQL durchführen?

Ich möchte eine [vollständige äußere Verknüpfung](https://en.wikipedia.org/wiki/Join(SQL)#Full_outerjoin) in MySQL. Ist dies möglich? Ist eine vollständige äußere Verknüpfung von MySQL unterstützt?

4 Stimmen

4 Stimmen

Auf diese Frage gibt es bessere Antworten

6 Stimmen

Achten Sie auf die Antworten hier. Der SQL-Standard besagt, dass full join on inner join on rows union all unmatched left table rows extended by nulls union all right table rows extended by nulls ist. Die meisten Antworten hier sind falsch (siehe die Kommentare) & die, die nicht falsch sind, behandeln den allgemeinen Fall nicht. Auch wenn es viele (ungerechtfertigte) Upvotes gibt. (Siehe meine Antwort.)

5voto

a20 Punkte 4691

I geändert shA.t's Anfrage für mehr Klarheit:

-- t1 left join t2
SELECT t1.value, t2.value
FROM t1 LEFT JOIN t2 ON t1.value = t2.value   

    UNION ALL -- include duplicates

-- t1 right exclude join t2 (records found only in t2)
SELECT t1.value, t2.value
FROM t1 RIGHT JOIN t2 ON t1.value = t2.value
WHERE t1.value IS NULL

4voto

Rami Jamleh Punkte 1696

In SQLite sollten Sie dies tun:

SELECT * 
FROM leftTable lt 
LEFT JOIN rightTable rt ON lt.id = rt.lrid 
UNION
SELECT lt.*, rl.*  -- To match column set
FROM rightTable rt 
LEFT JOIN  leftTable lt ON lt.id = rt.lrid

0 Stimmen

Können wir es verwenden? wie zum Beispiel: SELECT * FROM leftTable lt LEFT JOIN rightTable rt ON lt.id = rt.lrid UNION SELECT lt.*, rl.* -- Zum Abgleichen der Spaltenmenge FROM leftTable lt RIGHT JOIN rightTable rt ON lt.id = rt.lrid;

0 Stimmen

Ja, aber SQLite unterstützt keine Right Joins, aber in MYSQL ja

2 Stimmen

Diese Antwort ist falsch. Sie führt zu falschen Ergebnissen im Falle von doppelten Zeilen (Multisets).

3voto

ysth Punkte 91645

Sie können einfach eine vollständige äußere Verknüpfung umwandeln, z. B.

SELECT fields
FROM firsttable
FULL OUTER JOIN secondtable ON joincondition

in:

SELECT fields
FROM firsttable
LEFT JOIN secondtable ON joincondition
UNION ALL
SELECT fields (replacing any fields from firsttable with NULL)
FROM secondtable
WHERE NOT EXISTS (SELECT 1 FROM firsttable WHERE joincondition)

Oder wenn Sie mindestens eine Spalte haben, zum Beispiel foo , in firsttable die NICHT NULL ist, können Sie tun:

SELECT fields
FROM firsttable
LEFT JOIN secondtable ON joincondition
UNION ALL
SELECT fields
FROM firsttable
RIGHT JOIN secondtable ON joincondition
WHERE firsttable.foo IS NULL

2voto

lolo Punkte 16629

Sie können Folgendes tun:

(SELECT 
    *
FROM
    table1 t1
        LEFT JOIN
    table2 t2 ON t1.id = t2.id
WHERE
    t2.id IS NULL)
UNION ALL
 (SELECT 
    *
FROM
    table1 t1
        RIGHT JOIN
    table2 t2 ON t1.id = t2.id
WHERE
    t1.id IS NULL);

1 Stimmen

Eine Erklärung wäre angebracht. Bitte antworten Sie bis Bearbeitung (Änderung) Ihrer Antwort , nicht hier in den Kommentaren ( ohne "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden).

-2voto

Alex Pliutau Punkte 20530
SELECT
    a.name,
    b.title
FROM
    author AS a
LEFT JOIN
    book AS b
    ON a.id = b.author_id
UNION
SELECT
    a.name,
    b.title
FROM
    author AS a
RIGHT JOIN
    book AS b
    ON a.id = b.author_id

1 Stimmen

Diese Antwort ist falsch. Sie führt zu falschen Ergebnissen im Falle von doppelten Zeilen (Multisets).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X