مقدمه
FULL OUTER JOIN
عملگر اولیه ای نیست به این معنا که بود یا نبود آن باعث نقصان زبان SQL
نمی شود. این اتصال ترکیبی از دو اتصال LEFT OUTER و
RIGHT OUTER هست.
فرض کنید دو جدول A
و B هر کدام دارای مقادیر زیر هستند:
Table A:
i
--
1
2
3
Table B:
j
--
1
2
4
نتیجه اتصال خارجی به شرط تساوی دو
ستون i و j به شکل زیر خواهد بود:
i
j
----------- -----------
1 1
2 2
NULL 4
3
NULL
و query که
توسط آن نتیجه فوق حاصل شده است:
SELECT
*
FROM TableA
AS A
FULL
OUTER JOIN
TableB AS B
ON
A.i = B.j;
مساله
فرض کنید می خواهید نتیجه فوق را بدون
کمک FULL OUTER JOIN بدست آوردید. برای این کار نیاز هست
علاوه بر سطرهایی که شرط در آنها صدق می کند سطرهایی که Match
نشده اند نیز از هر دو جدول به نتیجه اضافه شده و مقدار مربوط به جدول دیگری با
NULL پر شود.
راه حل
SELECT a,
b
FROM TableA AS
A
INNER
JOIN TableB AS
B
ON A.a =
B.b
UNION
SELECT a,
NULL
FROM TableA AS
A
WHERE NOT
EXISTS
(SELECT
*
FROM TableB AS
B
WHERE
B.b = A.a)
UNION
SELECT
NULL, b
FROM TableB AS
B
WHERE NOT
EXISTS
(SELECT
*
FROM TableA AS
A
WHERE
A.a = B.b);