CREATE TABLE table_a ( id INTEGER NOT NULL PRIMARY KEY
, OrderDate DATE NOT NULL DEFAULT '2003-03-15');
CREATE TABLE table_b ( id INTEGER NOT NULL PRIMARY KEY
, OrderDate DATE NOT NULL DEFAULT '2003-04-15');
INSERT INTO table_a(id) VALUES (0),(2),(4),(6),(8),(10),(12),(14),(16),(18),(20);
INSERT INTO table_b(id) VALUES (0),(3),(6),(9),(12),(15),(18),(21);
SELECT COALESCE (a.id, b.id) AS id
FROM (
SELECT DISTINCT id
FROM table_a
WHERE OrderDate >= '2003-03-01' AND OrderDate < '2003-04-01'
) a
FULL OUTER JOIN (
SELECT DISTINCT id
FROM table_b
WHERE OrderDate >= '2003-04-01' AND OrderDate < '2003-05-01'
) b ON b.id = a.id
WHERE a.id IS NULL OR b.id IS NULL
;
注:OPが提供しなかったため、独自のデータを発明する必要があり、入力するのが面倒でした.
UPDATE: 元の UNION クエリ (ここでは table_a/table_b コンストラクトを使用し、元のデータ モデルには table_a = table_b = を使用しますSales.SalesOrderHeader
)
SELECT a.id, a.OrderDate
FROM table_a as a
WHERE a.OrderDate >= '2003-03-01' AND a.OrderDate < '2003-04-01' -- march only
AND NOT EXISTS (
SELECT * FROM table_b nx
WHERE nx.id = a.id
AND nx.OrderDate >= '2003-04-01' AND nx.OrderDate < '2003-05-01' -- april only
)
UNION ALL
SELECT b.id, b.OrderDate
FROM table_b as b
WHERE b.OrderDate >= '2003-04-01' AND b.OrderDate < '2003-05-01' -- april only
AND NOT EXISTS (
SELECT * FROM table_a nx
WHERE nx.id = b.id
AND nx.OrderDate >= '2003-03-01' AND nx.OrderDate < '2003-04-01' -- march only
)
ORDER BY OrderDate ASC;
ノート:
- 重複は不可能であり、削除する必要がないため、the にする
UNION
必要がありますUNION ALL
NOT EXISTS ()
句が必要です。4 月には存在しない記録が 3 月に必要であり、その逆も同様です。
- の必要性
UNION
は、多くの場合、最適化されていないデータ モデルを示しています (この場合はそうではありません)。
FULL OUTER JOIN
関係分割の特別な形態と見なすことができます