1

我有两个表,我从中返回参考代码。我需要比较这两个列表以查找仅存在于 tableA 或 tableB 中的引用,而不是两者中的引用。

例如,如果表 A 和表 B 有以下数据

TABLE A References
01
02
04

TABLE B References
01
22

我希望返回一个包含以下内容的表格

TABLE C References
02
04
22

用于此的 SQL 让我很困惑。有什么建议么?

4

7 回答 7

5

试试这个,

  SELECT COL1 FROM
    (
      SELECT Col1 FROM TABLE_A
      UNION ALL
      SELECT COL1 FROM TABLE_B
    ) X
     GROUP BY COL1
     HAVING COUNT(*) =1

如果任何值在同一个表中出现两次,此查询也将消除。

于 2013-05-10T08:47:30.303 回答
3
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子句删除找到匹配项的那些行,仅留下(作为结果)行仅存在于aor中的那些行b

然后COALESCE()根据您的预期输出,将结果用作单列。如果您愿意,您可以删除COALESCEand have SELECT a.Value,b.Valuewhich will have NULLs 但会立即显示哪个表包含该值。

于 2013-05-10T08:47:08.500 回答
1

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 个组件查询中的每一个。

于 2013-05-10T08:48:28.077 回答
0
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 )
于 2013-05-10T08:49:59.927 回答
0

请检查:

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)
于 2013-05-10T08:56:16.660 回答
0

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
        );
于 2013-05-10T09:17:32.417 回答
-1

解释:

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

于 2013-05-10T09:17:42.973 回答