我试图从一个表中联接,该表中的表和字段是在数据而不是键中定义的。这就是我所拥有的
表根:
ID | Table | Field
---+---------+-----------
1 | Tab1 | Field1
2 | Tab2 | Field2
3 | Tab1 | Field2
4 | Tab3 | Field4
5 | Tab1 | Field1
Tab1
ID | Field1
---+---------
1 | A
2 | B
3 | C
4 | D
Tab2
ID | Field1 |Field2
---+--------+-----------
1 | X | Bla
2 | Y | 123
3 | Z | 456
Tab3不存在
我想要一个这样的结果:
ID | Value
---+---------
1 | A
2 | 123
3 | NULL -- Field does not match
4 | NULL -- Tables does not exist
5 | NULL -- ID does not exist
基本上是尝试使用ID来联接动态表和字段。
我的出发点在Here附近,但这仅适用于单个特定表。我无法弄清楚如何动态加入,或者甚至在没有像exec这样的动态sql的情况下也无法加入。
答案 0 :(得分:0)
您可以使用case表达式和子查询来解决此问题,例如本例
declare @root table (id int, [table] varchar(10), Field varchar(10))
declare @tab1 table (id int, Field1 varchar(10))
declare @tab2 table (id int, Field1 varchar(10), Field2 varchar(10))
insert into @root (id, [table], Field)
values (1, 'Tab1', 'Field1'), (2, 'Tab2', 'Field2'), (3, 'Tab1', 'Field2'), (4, 'Tab3', 'Field4'), (5, 'Tab1', 'Field1')
insert into @tab1 (id, Field1)
values (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')
insert into @tab2 (id, Field1, Field2)
values (1, 'X', 'Bla'), (2, 'Y', '123'), (3, 'Z', '456')
select r.id,
case when r.[Table] = 'Tab1' and r.Field = 'Field1' then (select t1.Field1 from @tab1 t1 where t1.ID = r.ID)
when r.[Table] = 'Tab2' and r.Field = 'Field1' then (select t2.Field1 from @tab2 t2 where t2.id = r.id)
when r.[Table] = 'Tab2' and r.Field = 'Field2' then (select t2.Field2 from @tab2 t2 where t2.id = r.id)
end as Value
from @root r
结果是
id Value
-- -------
1 A
2 123
3 null
4 null
5 null