如何比较两个不同表中的两行

时间:2014-09-08 07:36:39

标签: sql-server

我有两个结构相同的表,但数据可能不同。所以我喜欢比较两行之间的数据并以特定方式显示差异的方法

因为这是我的样本数据

field name                OLD VALUE      NEW VALUE

------------             ----------      ---------

Name                       Ram           sam

age                        31            56

salary                     12000         26100

所以请指导我如何在sql server中编写脚本,在比较两行之后将显示上面的diff。感谢

2 个答案:

答案 0 :(得分:1)

CREATE TABLE #aaa 
(
    id INT,
    NAME NVARCHAR(10)
)
CREATE TABLE #bbb
(
    id INT,
    NAME NVARCHAR(10)
)
INSERT INTO #aaa( id, NAME )
VALUES  ( 1, N'aaa'), (2, N'bbb')  

INSERT INTO #bbb( id, NAME )
VALUES  ( 1, N'ccc'), (2, N'bbb')


(
    SELECT *
    FROM #aaa
    EXCEPT
    SELECT *
    FROM #bbb            
)
UNION ALL              
(
    SELECT *
    FROM #bbb
    EXCEPT
    SELECT *
    FROM #aaa     
)        

如果你在这两张桌子之间没有任何关系 - 找到" old"和"新"值。

答案 1 :(得分:0)

在两个表上使用 unpivot ,在结果上使用full outer join。将是一种方式,我相信这正是你想要的:

;WITH Table1CTE AS
(
    SELECT *
    FROM 
    (
        SELECT ID,
               CONVERT(VARCHAR,Name) AS Name,
               CONVERT(VARCHAR,Age) AS Age,
               CONVERT(VARCHAR,Salary) AS Salary
        FROM   Table1 
    ) P
    UNPIVOT
   (
       Value For Field IN
      (Name,Age,Salary)
   ) AS T
), Table2CTE AS
(
    SELECT *
    FROM 
    (
        SELECT ID,
               CONVERT(VARCHAR,Name) AS Name,
               CONVERT(VARCHAR,Age) AS Age,
               CONVERT(VARCHAR,Salary) AS Salary
        FROM   Table2 
    ) P
    UNPIVOT
    (
        Value For Field IN
        (Name,Age,Salary)
    ) AS T
)
SELECT COALESCE(OLD.ID,NEW.ID) AS ID,
       COALESCE(OLD.Field,NEW.Field) AS Field,
       OLD.Value AS OldValue,
       NEW.Value AS NewValue
FROM   Table1CTE OLD
       FULL OUTER JOIN Table2CTE NEW
       ON OLD.Id = NEW.Id
           AND OLD.Field = NEW.Field

<强> SQL Fiddle Demo

另一种方式是多个工会:

SELECT COALESCE(Old.Id,New.Id) AS ID,
       'Name' AS 'Field',
       Old.Name AS 'Old Value',
       New.Name AS 'New Value'
FROM   Table1 Old
       FULL OUTER JOIN Table2 New
           ON Old.Id = New.Id
UNION ALL
SELECT COALESCE(Old.Id,New.Id) AS ID,
       'Age' AS 'Field',
       Old.Age AS 'Old Value',
       New.Age AS 'New Value'
FROM   Table1 Old
       FULL OUTER JOIN Table2 New
           ON Old.Id = New.Id
UNION ALL
SELECT COALESCE(Old.Id,New.Id) AS ID,
       'salary' AS 'Field',
       Old.Salary AS 'Old Value',
       New.Salary AS 'New Value'
FROM   Table1 Old
       FULL OUTER JOIN Table2 New
           ON Old.Id = New.Id

另一种方法是将每个id的所有差异放在一行中:

SELECT COALESCE(Old.Id,New.Id) AS ID,
       Old.Name AS 'OldName',
       New.Name AS 'NewName',
       Old.Age AS 'OldAge',
       New.Age AS 'NewAge',
       Old.Salary AS 'OldSalary',
       New.Salary AS 'NewSalary'
FROM   Table1 Old
       FULL OUTER JOIN Table2 New
           ON Old.Id = New.Id