首页 > 解决方案 > 查询在没有主键的两个表中查找不匹配的记录

问题描述

我想使用完全外连接和 where 子句(下面写的查询)从两个表(如下所示)中选择不匹配的记录。这两个表都没有主键。我认为由于外部连接,我得到了结果中的所有 3 条记录。有没有办法通过修改查询只返回不匹配的记录?(即第三条记录)。

表格1:

在此处输入图像描述

表2:

在此处输入图像描述

使用的查询:

    DECLARE @table1 TABLE  (element_type varchar(100),element_code  varchar(100), value varchar(100))
    DECLARE @table2 TABLE  (element_type varchar(100),element_code  varchar(100), value varchar(100))
    
    Insert into @table1
    values
    ('ABC', 'CODE1', 'Interest Due'),
    ('ABC', 'CODE1', NULL),
    ('BCD', 'CODE2', 'value1')
    
    Insert into @table2
    values
    ('ABC', 'CODE1', 'Interest Due'),
    ('ABC', 'CODE1', NULL),
    ('BCD', 'CODE2', 'value2')
    
    SELECT  
            [Element Type] = ISNULL(m1.element_type, m2.element_type),
            [Differences]  = 'value missmatch'
        FROM    
            @table1 m1 
            FULL OUTER JOIN @table2 m2 
                ON m1.element_type = m2.element_type AND m1.element_code = m2.element_code
        WHERE
        ISNULL(m1.value, '') <> ISNULL(m2.value, '')

输出:

在此处输入图像描述

期望的输出:

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


集合运算符 - EXCEPT 和 INTERSECT

WITH result AS (
  (SELECT * FROM @table1 UNION SELECT * FROM @table2)
  EXCEPT
  (SELECT * FROM @table1 INTERSECT SELECT * FROM @table2)
)
SELECT DISTINCT element_type, element_code, 'value missmatch' AS Differences
FROM result;

小提琴


推荐阅读