5

假设您在 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

4 回答 4

13

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

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列中值的存在,因此请尝试每种方法以找到最有效的方法,以提供您期望的结果。

于 2013-03-22T15:37:32.330 回答
3
SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]

Table2 中 column1 的所有值,但 Table1 的 column1 中不存在

于 2013-03-22T15:38:48.520 回答
1

基本上,您可以使用LEFT JOIN.

TableB在这种情况下被设置为主表。通过TableAusing加入它LEFT JOIN,在 a 上不匹配的记录TableA仍将在结果列表中,但它们的值为NULL。所以要过滤掉不匹配的记录,添加一个过滤条件,只选择tableA上具有NULL值的记录。

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

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-03-22T15:36:50.283 回答
0

SQL Server 2005之后你可以使用Except

SELECT DISTINCT [dbo].[table2].[column1]
FROM [dbo].[table2]
Except
SELECT DISTINCT [dbo].[table1].[column1]
FROM [dbo].[table1]
于 2013-03-22T15:39:50.027 回答