【问题标题】:Find missing values on the same column of two tables在两个表的同一列上查找缺失值
【发布时间】:2013-03-22 15:35:24
【问题描述】:
假设您在 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
【问题讨论】:
标签:
sql-server
tsql
compare
diff
missing-data
【解决方案1】:
有几种方法可以做到这一点...
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 值的存在,因此请尝试每种方法以找到最有效的方法,以提供您期望的结果。
【解决方案2】:
SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]
Table2 中 column1 的所有值,但 Table1 的 column1 中不存在
【解决方案3】:
基本上,您可以使用LEFT JOIN。
TableB 在这种情况下被设置为主表。通过使用LEFT JOIN 将其与TableA 连接,TableA a 上不匹配的记录仍将在结果列表中,但它们的值为 NULL。所以要过滤掉不匹配的记录,添加一个过滤条件,只选择tableA上具有NULL值的记录。
SELECT b.*
FROM tableB b
LEFT JOIN tableA a
ON a.column1 = b.column1
WHERE a.column1 IS NULL
如需进一步了解联接,请访问以下链接:
【解决方案4】:
SQL Server 2005 以后你可以使用Except
SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
Except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]