我有两个表,我从中返回参考代码。我需要比较这两个列表以查找仅存在于 tableA 或 tableB 中的引用,而不是两者中的引用。
例如,如果表 A 和表 B 有以下数据
TABLE A References
01
02
04
TABLE B References
01
22
我希望返回一个包含以下内容的表格
TABLE C References
02
04
22
用于此的 SQL 让我很困惑。有什么建议么?
试试这个,
SELECT COL1 FROM
(
SELECT Col1 FROM TABLE_A
UNION ALL
SELECT COL1 FROM TABLE_B
) X
GROUP BY COL1
HAVING COUNT(*) =1
如果任何值在同一个表中出现两次,此查询也将消除。
select
COALESCE(a.Value,b.Value)
FROM
a
full outer join
b
on
a.Value = b.Value
WHERE
a.Value is null or
b.Value is null
应该做的伎俩。FULL OUTER JOIN
尝试匹配两个表中的所有行。然后,该WHERE
子句删除找到匹配项的那些行,仅留下(作为结果)行仅存在于a
or中的那些行b
。
然后COALESCE()
根据您的预期输出,将结果用作单列。如果您愿意,您可以删除COALESCE
and have SELECT a.Value,b.Value
which will have NULL
s 但会立即显示哪个表包含该值。
SQL 服务器:
( select 'A' as source, reference
from tableA
EXCEPT
select 'A' as source, reference
from tableB)
UNION ALL
( select 'B' as source, reference
from tableB
EXCEPT
select 'B' as source, reference
from tableA)
==================
source | reference
==================
A 02
A 04
B 22
在 A 中查找除B 中的所有内容之外的所有内容,并添加(UNION ALL)B 中的内容,但 A 中的内容(除外)。这标识了每个引用的来源,但您当然可以删除“来源”列4 个组件查询中的每一个。
Select Distinct ( isnull(A.References,B.Referecces))
from A full join B on A.References<>B.References
where ( not exists ( Select * from B as B1 where B1.References=A.References ) and A.References is not null ) or
( not exists ( Select * from A as a1 where a1.References=B.References ) and B.References is not null )
请检查:
select a.*
FROM
tblA a LEFT JOIN tblB b on a.ColRef=b.ColRef
where b.ColRef IS NULL
UNION ALL
select b.*
FROM
tblB b LEFT JOIN tblA a on b.ColRef=a.ColRef
where a.ColRef IS NULL
或者
select * from(
select * from tblA
union
select * from tblB
)x where x.ColRef NOT IN (select a.ColRef From tblA a JOIN tblB b on a.ColRef=b.ColRef)
CTE 上的自反加入:
WITH two AS (
SELECT val AS val, 'A' AS flag FROM lutser_a
UNION ALL
SELECT val AS val, 'B' AS flag FROM lutser_b
)
SELECT *
FROM two t
WHERE NOT EXISTS (
SELECT * FROM two nx
WHERE nx.val = t.val
AND nx.flag <> t.flag
);
解释:
SELECT ISNULL(TABLE_A.Col1,TABLE_B.Col1)
FROM TABLE_A
LEFT JOIN TABLE_B ON TABLE_A.Col1 = TABLE_B.Col1
WHERE TABLE_A.Col1<> TABLE_B.Col1
查询的 Join 部分会给我们这样的表
01 空
02 02
空 03
Where 部分将删除重复值
01 空空
03
IsNull 部分将从表中选择不为空的值
01
03