在两个表的同一列上查找缺失值

时间:2013-03-22 15:35:25

标签: sql-server tsql compare diff missing-data

假设SQL Server数据库中有两个表,两个表具有相同的模式。我想比较两个表上的单个列,并找到table1中缺少但在table2中的值。我在每个查询中得到一个不同的列表后,我已经在Excel中手动执行了这个操作,但如果我有一个查询,那么工作就会少一些。如何通过T-SQL找到丢失的记录?我想针对以下数据类型执行此操作:datetime, nvarchar & bigint

SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]
ORDER BY [dbo].[table1].[column1] DESC

SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
ORDER BY [dbo].[table2].[column1] DESC

4 个答案:

答案 0 :(得分:10)

有几种方法可以做到这一点......

LEFT JOIN

SELECT DISTINCT t2.column1
FROM dbo.table2 t2
LEFT JOIN dbo.table1 t1
  ON t2.Column1 = t1.Column1
WHERE t1.Column1 IS NULL

NOT EXISTS

SELECT DISTINCT t2.column1
FROM dbo.table2 t2
WHERE NOT EXISTS (
  SELECT 1
  FROM dbo.table1 t1
  WHERE t1.column1 = t2.column1
)

NOT IN

SELECT DISTINCT t2.column1
FROM dbo.table2 t2
WHERE t2.column1 NOT IN (
  SELECT t1.column1
  FROM dbo.table1 t1
)

这些方法的行为和效率略有不同......主要基于列中NULL值的存在,因此请尝试使用每种方法找到最有效的方法,以获得您期望的结果

答案 1 :(得分:1)

基本上,您可以使用LEFT JOIN

在这种情况下,

TableB被设置为主表。通过使用TableA将其与LEFT JOIN相关联,TableA a上不匹配的记录仍将位于结果列表中,但其值为 NULL 。因此,要过滤掉不匹配的记录,请添加一个过滤条件,该条件仅在tableA上选择 NULL 值的记录。

SELECT  b.*
FROM    tableB b
        LEFT JOIN tableA a
            ON a.column1 = b.column1
WHERE   a.column1 IS NULL

要进一步了解联接,请访问以下链接:

答案 2 :(得分:0)

SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]

Table2中column1的所有值都不存在于Table1的column1中

答案 3 :(得分:0)

SQL Server 2005以后您可以使用Except

SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
Except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]