sql - 使用动态表和列名加入
问题描述
我正在尝试从表和字段在数据中定义而不是键的表中加入。所以这就是我所拥有的
表根:
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 甚至可能。
解决方案
你可以用 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
推荐阅读
- c# - Magick.NET 如何使用 .ColorFuzz 作为图像比较的像素容差
- syntax-error - vivado中调用模块时出现语法错误
- google-sheets - 表格公式转置、拆分和重复多列
- python - 如何为熊猫构建 whl 包?
- spring-boot - Spring-boot Activiti TaskUser在执行TaskService.complete时导致回滚
- reactjs - 如何在反应大日历中禁用事件选择
- java-8 - 文本剥离器停止并等待
- java - Jar 不工作,但程序在 IDE 中工作
- javascript - DC.js如何添加多个yAxis(不是对YAxis)
- ios - 多语言错误