【问题标题】: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]
          

          【讨论】:

            猜你喜欢
            • 2015-05-01
            • 1970-01-01
            • 2021-05-08
            • 2017-11-03
            • 1970-01-01
            • 1970-01-01
            • 2013-08-08
            • 2019-07-18
            • 2019-08-04
            相关资源
            最近更新 更多