SQL Server表比较

时间:2015-07-28 18:09:21

标签: sql sql-server

我陷入困境 - 我在SQL服务器表A和表B中有2个表,表有5列,表有6列

Table A                   Table B
A B C D E F               A B C D E F G
1 2 9 4 5 6               1 2 3 4 5 6 10
4 5 6 7 3 9               4 5 6 7 8 9 10

表B是正确的组合表。我想找出表A中哪个列值不正确以及该值的正确值。所有列都可以有多个值。例如表A中的第9行不正确,它应该是表B第一行中正确组合的3。

2 个答案:

答案 0 :(得分:1)

只有当两个表具有相应的行时,这才有效,因为没有唯一的标识符和引用列,我使用行序列构建了自己的行。

<强>模式

Create Table tableA (A VARCHAR(10), B VARCHAR(10), C VARCHAR(10),
                     D VARCHAR(10), E VARCHAR(10), F VARCHAR(10))
Create Table tableB (A VARCHAR(10), B VARCHAR(10), C VARCHAR(10),
                     D VARCHAR(10), E VARCHAR(10), F VARCHAR(10), 
                     G VARCHAR(10))

Insert Into tableA Values ('1', '2', '9', '4', '5', '6'), 
('4', '5', '6', '7', '3', '9'),
('Retail', 'CatMgr', 'N6N', '25', 'M5', '58')

Insert Into tableB Values ('1', '2', '3', '4', '5', '6', '10'), 
('4', '5', '6', '7', '8', '9', '10'), 
('Retail', 'CatMgr', 'N6N', '155', 'M5', '55', '62')

<强>查询

;With AU AS (
Select RowNumber, ColumnVal, ColumnName  From 
    (Select ROW_NUMBER() OVER(ORDER BY (Select 0))  RowNumber, *
    From tableA) tA
    Unpivot (ColumnVal For ColumnName IN (A, B, C, D, E, F)) U
), BU AS (
Select RowNumber, ColumnVal, ColumnName  From 
    (Select ROW_NUMBER() OVER(ORDER BY (Select 0))  RowNumber, * 
    From tableB) tB
    Unpivot (ColumnVal For ColumnName IN (A, B, C, D, E, F)) U
) Select AU.RowNumber, AU.ColumnName, AU.ColumnVal CurrentValue, BU.ColumnVal CorrectValue 
From AU
Join BU ON BU.RowNumber = AU.RowNumber and AU.ColumnName = BU.ColumnName
Where AU.ColumnVal != BU.ColumnVal

查询首先在列中展开数据,以便我们可以轻松地比较,按行号和列名连接两个表,并找出哪些列不同。

如果行不对应(我不确定我在这里使用正确的词)我希望这仍然可以给你一些想法。这里唯一缺少的部分是如何知道要比较哪些行。

这是小提琴:http://sqlfiddle.com/#!3/def6f/4/0

答案 1 :(得分:0)

假设我们有一些关键来确保我们比较每个表中的同一行:

Select *
from A
full outer join B
on A.A = B.A --taking column A as the key to relate row1 in table A with row1 in table b
where A.A is null --record in B which is not in A
or B.A is null --record in A which is not in B
or (A.B != B.B or (A.B is null != B.B is null)) --mismatch on B
or (A.C != B.C or (A.C is null != B.C is null)) --mismatch on C
or (A.D != B.D or (A.D is null != B.D is null)) --mismatch on D
or (A.E != B.E or (A.E is null != B.E is null)) --mismatch on E
or (A.F != B.F or (A.F is null != B.F is null)) --mismatch on F
相关问题