假设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
答案 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]