我有一個類似於this StackOverflow question的問題,除了我需要從比較中排除某些字段,但仍將其包含在結果集中。
我將這個問題視爲局部對稱差異。sql中的局部對稱差異
例如表A和B具有列X,Y,Z,我想比較只有Y,Z的差異,但我還是希望結果集中包括X.
我有一個類似於this StackOverflow question的問題,除了我需要從比較中排除某些字段,但仍將其包含在結果集中。
我將這個問題視爲局部對稱差異。sql中的局部對稱差異
例如表A和B具有列X,Y,Z,我想比較只有Y,Z的差異,但我還是希望結果集中包括X.
舊風格的SQL全額加盟 - 一個與級聯B,但不包括在列B還在A(中間):
-- all rows in A with or without matching B
select a.x, a.y, a.z
from a
left join b
on a.x = b.x
and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
from b
where not exists (select null
from a
where b.x = a.x
and b.y = a.y)
ANSI風格:
select coalesce(a.x, b.x) as x,
coalesce(a.y, b.y) as y,
a.z
from a
full outer join b
on a.x = b.x
and a.y = b.y
的聚結的在那裏爲安全;我從來沒有真正有理由在現實世界中寫出完整的外連接。
如果你真的想找出如果兩個表是相同的,這裏是如何:
SELECT COUNT(*)
FROM (SELECT list_of_columns
FROM one_of_the_tables
MINUS
SELECT list_of_columns
FROM the_other_table
UNION ALL
SELECT list_of_columns
FROM the_other_table
MINUS
SELECT list_of_columns
FROM one_of_the_tables)
如果返回非零結果,則是有區別的。它不會告訴你它在哪個表中,但它是一個開始。
這最後的查詢也將返回如果0 'one_of_the_tables'包含'the_other_table'中的一部分數據。您需要在兩個方向上執行MINUS以測試數據集是否完全相同。 – 2010-08-25 13:22:20
@Dave Costa - 您是對的,先生。答案已更正。 – 2010-08-25 17:08:28
這樣的聲音基本上是你想要的。在列Y和Z兩個表之間的匹配行,發現不匹配的行和輸出列X,Y和Z值
SELECT a.x, a.y, a.z, b.x, b.y, b.z
FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
WHERE a.y IS NULL OR b.y IS NULL
實例數據與預期輸出請 – 2010-08-25 00:44:02