首页 > 解决方案 > 使用动态表和列名加入

问题描述

我正在尝试从表和字段在数据中定义而不是键的表中加入。所以这就是我所拥有的

表根:

ID | Table   | Field
---+---------+-----------
 1 |   Tab1  | Field1  
 2 |   Tab2  | Field2  
 3 |   Tab1  | Field2
 4 |   Tab3  | Field4  
 5 |   Tab1  | Field1 

选项卡1

ID | Field1  
---+---------
 1 |  A
 2 |  B  
 3 |  C  
 4 |  D  

选项卡2

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 甚至可能。

标签: sqlsql-server

解决方案


你可以用 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    

推荐阅读