Sql server 查找两个表之间的增量

Sql server 查找两个表之间的增量,sql-server,tsql,Sql Server,Tsql,我有两个表,我们称它们为表A和表B。两个表的大小不同,但主键(ID)相同。变量字段为(名称)。我想从表B返回以下行: 数据发生了变化 以前没有数据 每次执行SQL时,返回的数据将有一个附加的列标记为comments,其值设置为高于。我已经在下面编写了T-SQL,但是有更好的方法吗 SELECT [ID] ,[Name] ,'Data did not exist before' AS [Comment] FROM TABLENAMEB WHERE [ID] NOT IN (SELECT [ID]

我有两个表,我们称它们为表A和表B。两个表的大小不同,但主键(ID)相同。变量字段为(名称)。我想从表B返回以下行:

  • 数据发生了变化
  • 以前没有数据
  • 每次执行SQL时,返回的数据将有一个附加的列标记为comments,其值设置为高于。我已经在下面编写了T-SQL,但是有更好的方法吗

    SELECT [ID]
    ,[Name]
    ,'Data did not exist before' AS [Comment]
    FROM TABLENAMEB
    WHERE [ID] NOT IN (SELECT [ID] FROM #TABLENAMEA)
    UNION
    SELECT B.[ID]
    ,B.[Name]
    ,'Data has changed' AS [Comment]
    FROM  TABLENAMEB B
    LEFT JOIN TABLENAMEA A ON B.[ID] = A.[ID] 
    WHERE A.[Name] != B.[Name]
    

    您可能可以使用left join和
    case
    获得相同的结果:

    SELECT [ID]
          ,[Name]
          ,CASE 
           WHEN A.[Name] IS NULL THEN -- Assuming `Name` in table a is not nullable.
               'Data did not exist before'
           WHEN B.[Name] != A.[Name THEN 
               'Data has changed'
           ELSE 
               ''
           END As [Comment]
    FROM TABLENAMEB As B
    LEFT JOIN #TABLENAMEA As A ON B.[ID] = A.[ID]
    

    您可能可以使用left join和
    case
    获得相同的结果:

    SELECT [ID]
          ,[Name]
          ,CASE 
           WHEN A.[Name] IS NULL THEN -- Assuming `Name` in table a is not nullable.
               'Data did not exist before'
           WHEN B.[Name] != A.[Name THEN 
               'Data has changed'
           ELSE 
               ''
           END As [Comment]
    FROM TABLENAMEB As B
    LEFT JOIN #TABLENAMEA As A ON B.[ID] = A.[ID]
    
    大概是这样的:

    DECLARE @tblA TABLE(ID INT, Name VARCHAR(100));
    INSERT INTO @tblA VALUES(1,'test1'),(2,'test2'),(4,'test4');
    
    DECLARE @tblB TABLE(ID INT, Name VARCHAR(100));
    INSERT INTO @tblB VALUES(2,'test2'),(3,'test3'),(4,'different');
    
    SELECT CASE WHEN A.ID IS NULL THEN 'missing in A'
                WHEN B.ID IS NULL THEN 'missing in B'
                WHEN A.Name<>B.Name THEN 'different'
                ELSE 'okay' END AS Comment
                ,*
    FROM @tblA AS A
    FULL OUTER JOIN @tblB AS B ON A.ID=B.ID
    
    大概是这样的:

    DECLARE @tblA TABLE(ID INT, Name VARCHAR(100));
    INSERT INTO @tblA VALUES(1,'test1'),(2,'test2'),(4,'test4');
    
    DECLARE @tblB TABLE(ID INT, Name VARCHAR(100));
    INSERT INTO @tblB VALUES(2,'test2'),(3,'test3'),(4,'different');
    
    SELECT CASE WHEN A.ID IS NULL THEN 'missing in A'
                WHEN B.ID IS NULL THEN 'missing in B'
                WHEN A.Name<>B.Name THEN 'different'
                ELSE 'okay' END AS Comment
                ,*
    FROM @tblA AS A
    FULL OUTER JOIN @tblB AS B ON A.ID=B.ID
    

    编辑:我刚刚注意到你正在使用2008。以下功能没有任何用处

    您使用的是T-SQL,因此您使用的是SQL Server。查看这两个专门为回答您的问题而设计的功能之一:

  • 更改数据捕获
  • 时态表

  • 编辑:我刚刚注意到你正在使用2008。以下功能没有任何用处

    您使用的是T-SQL,因此您使用的是SQL Server。查看这两个专门为回答您的问题而设计的功能之一:

  • 更改数据捕获
  • 时态表