使用字段映射比较两个表

时间:2016-01-18 00:47:58

标签: sql-server database

我需要比较两个SQL Server数据库中的表之间的值。一个数据库中的表中的字段名与第二个数据库中的表中的字段名不匹配。我有一个链接表,具有匹配的表名称和匹配的字段名称映射。

表1:

| Tab1_ID | Field1 | Field2 | Field3 |
|---------|--------|--------|--------|
|       1 | One    | Two    | Three  |
|       2 | Two    | Two    | One    |
|       3 | Three  | Two    | Two    |
|       4 | Two    | One    | One    |

表2:

| Tab2_ID | Field_1 | Field_2 | Field_3 |
|---------|---------|---------|---------|
|       1 | One     | Two     | Three   |
|       2 | Two     | Five    | One     |
|       3 | Three   | Two     | Two     |
|       4 | Two     | One     | Six     |

链接表:

| LinkTab_ID | Tab1   | Tab2   | Tab1Fld | Tab2Fld      |
|------------|--------|--------|---------|--------------|
|        100 | Table1 | Table2 | Field1  | Field_1      |
|        105 | Table1 | Table2 | Field2  | Field_2      |
|        110 | Table1 | Table2 | Field3  | Field_3      |
|        124 | Table1 | Table4 | Field1  | Fieldname_01 |
|        166 | Table3 | Table5 | F3      | FN_3         |

是否可以使用链接表以某种方式指定要在两个表之间进行比较的字段名称?

通常我会做类似

的事情
SELECT
    *
FROM 
    Table1 INNER JOIN Table2 ON Tab1_ID = Tab2_ID
WHERE 
    Table1.Field1 != Table2.Field_1 
    OR Table1.Field2 != Table2.Field_2

但是我有很多表和许多字段,字段名也会改变(即新字段)。我的一个常量是两个映射在链接表中。

这些表是一对一的,字段是一对一的。

1 个答案:

答案 0 :(得分:1)

这只是您需要扩展它以适应的方法。特别是,您需要一种处理连接谓词的方法。

另见SQL Fiddle

CREATE TABLE LinkTable
    ([LinkTab_ID] int, [Tab1] varchar(6), [Tab2] varchar(6), [Tab1Fld] varchar(6), [Tab2Fld] varchar(12))
;

INSERT INTO LinkTable
    ([LinkTab_ID], [Tab1], [Tab2], [Tab1Fld], [Tab2Fld])
VALUES
    (100, 'Table1', 'Table2', 'Field1', 'Field_1'),
    (105, 'Table1', 'Table2', 'Field2', 'Field_2'),
    (110, 'Table1', 'Table2', 'Field3', 'Field_3'),
    (124, 'Table1', 'Table4', 'Field1', 'Fieldname_01'),
    (166, 'Table3', 'Table5', 'F3', 'FN_3')
;

CREATE TABLE Table1
    ([Tab1_ID] int, [Field1] varchar(5), [Field2] varchar(3), [Field3] varchar(5))
;

INSERT INTO Table1
    ([Tab1_ID], [Field1], [Field2], [Field3])
VALUES
    (1, 'One', 'Two', 'Three'),
    (2, 'Two', 'Two', 'One'),
    (3, 'Three', 'Two', 'Two'),
    (4, 'Two', 'One', 'One')
;

CREATE TABLE Table2
    ([Tab2_ID] int, [Field_1] varchar(9), [Field_2] varchar(9), [Field_3] varchar(9))
;

INSERT INTO Table2
    ([Tab2_ID], [Field_1], [Field_2], [Field_3])
VALUES
    ('1', 'One', 'Two', 'Three'),
    ('2', 'Two', 'Five', 'One'),
    ('3', 'Three', 'Two', 'Two'),
    ('4', 'Two', 'One', 'Six')
;

查询1

DECLARE @t1 AS NVARCHAR(30) = 'Table1'
DECLARE @t2 AS NVARCHAR(30) = 'Table2'
DECLARE @filter AS NVARCHAR(MAX)
DECLARE @query  AS NVARCHAR(MAX)

SET @filter = STUFF((SELECT ' OR ' + concat(Tab1, '.', Tab1Fld, ' <> ', Tab2, '.', Tab2Fld)
            FROM LinkTable
            WHERE Tab1 = @t1 AND Tab2 = @t2
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,4,'')

SET @query = 'SELECT * FROM '
             + @t1 
             + ' INNER JOIN ' 
             + @t2 
             + ' ON '
             + @t1 
             + '.Tab1_ID = '
             + @t2 
             + '.Tab2_ID'
             + ' WHERE '+ @filter

select @query
--execute(@query)

<强> Results

| SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Tab1_ID = Table2.Tab2_ID WHERE Table1.Field1 <> Table2.Field_1 OR Table1.Field2 <> Table2.Field_2 OR Table1.Field3 <> Table2.Field_3 |