与动态表和列名称联接

时间:2019-07-04 11:36:06

标签: sql sql-server

我试图从一个表中联接,该表中的表和字段是在数据而不是键中定义的。这就是我所拥有的

表根:

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的情况下也无法加入。

1 个答案:

答案 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