我有两个结构相同的表,但数据可能不同。所以我喜欢比较两行之间的数据并以特定方式显示差异的方法
field name OLD VALUE NEW VALUE
------------ ---------- ---------
Name Ram sam
age 31 56
salary 12000 26100
所以请指导我如何在sql server中编写脚本,在比较两行之后将显示上面的diff。感谢
答案 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