代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

T-SQL:比较两个表-第二个表中不存在的记录

  •  10
  • BuddyJoe  · 技术社区  · 16 年前

    如果 UNION ALL 是一个 附加 在T-SQL中。减法的等价物是什么?

    例如,如果我有一张桌子 PEOPLE 一张桌子 EMPLOYEES . 我知道如果我移除 员工 记录来自 我将留在我的公司 CONTRACTORS .

    有没有类似的方法 联合所有 ?一个我不需要指定任何字段名的地方?我问的原因是这只是一个假设性的例子。我需要在许多不同的桌子上做几次。假设 员工 都一样。

    7 回复  |  直到 13 年前
        1
  •  11
  •   Charles Bretana    16 年前

    不要使用union,而是使用except,(或intersect只获取这两者中的记录) 如上所述

    msdn EXCEPT Link for Sql2k8

    msdn EXCEPT Link for Sql2k5

        2
  •  12
  •   Eric Ness    16 年前

    你可以使用 EXCEPT operator 从另一个集合中减去一个集合。下面是使用Employees和People临时表的代码示例。据我所知,您需要将字段名与except运算符一起使用。

    CREATE TABLE #PEOPLE
    (ID INTEGER,
     Name NVARCHAR(50))
    
    CREATE TABLE #EMPLOYEE
    (ID INTEGER,
     Name NVARCHAR(50))
    GO
    
    INSERT #PEOPLE VALUES (1, 'Bob')
    INSERT #PEOPLE VALUES (2, 'Steve')
    INSERT #PEOPLE VALUES (3, 'Jim')
    INSERT #EMPLOYEE VALUES (1, 'Bob')
    GO
    
    SELECT ID, Name
    FROM #PEOPLE
    EXCEPT 
    SELECT ID, Name
    FROM #EMPLOYEE
    GO
    

    最后一个查询将返回人员表中不存在的两行。

        3
  •  11
  •   Tom H    16 年前
    SELECT
         P.*
    FROM
         People P
    LEFT OUTER JOIN Employees E ON
         E.ID = P.ID     -- Or whatever your PK-FK relationship is
    WHERE
         E.ID IS NULL
    

    对于SQL Server来说,这可能是最有效的方法。

        4
  •  3
  •   Greg Dean    16 年前
    SELECT * FROM Table1
    WHERE Table1.Key NOT IN (SELECT Table2.Key FROM Table2 WHERE Table2.Key IS NOT NULL)
    

    添加的不是空的,以使人们高兴。

    我同意汤姆的意见。他的版本很可能更有效率。唯一可能使用我的,可能是因为它更漂亮。

        5
  •  1
  •   call me Steve    16 年前

    不幸的是,您的设计有问题。 而不是两个餐桌上的人和承包商。 您应该有一个表人员和另一个表类型(如果有些人可以有多个角色,则可能需要另一个表)。 在您的人员表中,您引用了类型表。

    然后你的请求变成

    SELECT * from PEOPLE, TYPE
    WHERE PEOPLE.type_id = TYPE.id 
    AND TYPE.name = 'CONTRACTOR'
    
    SELECT * from PEOPLE, TYPE
    WHERE PEOPLE.type_id = TYPE.id 
    AND TYPE.name = 'EMPLOYEE'
    

    (未经测试)

        6
  •  1
  •   xkonnectDeveloper    13 年前

    当我比较查找不在另一个表中的数据的表时,我通常使用SQL除法。

    select *(or selected matching field) 
    from tableA as A
    where not exist
    (select *(or selected matching field) 
    from tableB as B 
    where A.key = B.key)
    

    此查询将返回表A中未通过除法处理的结果。

    select *(or selected matching field) 
    from tableA as A
    where exist
    (select *(or selected matching field) 
    from tableB as B 
    where A.key = B.key)
    

    此查询将返回两个表中匹配的所有数据行,因此,如果表A中有一行数据不在表B中,则不会检索该行数据。

        7
  •  0
  •   Poul H    15 年前

    我发现使用像sqlmerger这样的工具来为您完成这项工作要容易得多。结果以更好的方式显示,之后您可以轻松地继续处理您需要处理的数据。

    www.auisoft.com/sqlmerge<=能够轻松比较数据的工具

    比较两个表的示例: http://auisoft.com/SQLMerger/How-to/visualize-differences-in-2-databases/