我需要比较两个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
但是我有很多表和许多字段,字段名也会改变(即新字段)。我的一个常量是两个映射在链接表中。
这些表是一对一的,字段是一对一的。
答案 0 :(得分:1)
这只是您需要扩展它以适应的方法。特别是,您需要一种处理连接谓词的方法。
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 |