具有所有字段名称和名称不存在的空值的 UNION
Posted
技术标签:
【中文标题】具有所有字段名称和名称不存在的空值的 UNION【英文标题】:UNION with all field names and nulls where names don't exist 【发布时间】:2019-10-22 19:12:04 【问题描述】:我正在摆弄这段代码来查找所有表名以及我需要的所有字段。
select t.name, c.name
from sys.columns c
join sys.tables t
on c.object_id = t.object_id
where c.name like '%ID%'
OR c.name like '%ID1%'
OR c.name like '%ID2%'
OR c.name like '%ID3%'
OR c.name like '%ABC%'
OR c.name like '%RTG%'
order by c.name
我得到了几百个表名和字段名。基本上,我试图找出最简单的方法来获得这样的结果:
select col1, col2, col3, null as col4 from table1
union all
select col1, col2, col3, null as col4 from table2
union all
select col1, col2, col3, col4 from table3;
这里的挑战是......我可以输入逻辑,但我要处理数百个表/字段,并且很难对所有这些逻辑进行硬编码。我正在使用 SQL Server Azure。想法?想法?有什么建议吗?
【问题讨论】:
这看起来像是一个 XY 问题。我非常怀疑您的每个表对它们的 all 列都有相同的定义;如果他们不这样做,那么这本身就是一个设计缺陷。 【参考方案1】:我不知道我是否真的推荐这个,但你可以使用一个作用域技巧,所以所有子查询基本相同:
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
(select a, b, c, d
from table1
) t
union all
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
(select a, b, c, d
from table2
) t
. . .
基本上,子查询将从表中选择值如果它们存在。否则,它将从v
获取它们。
编辑:
或者正如马丁指出的那样:
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
((select a, b, c, d from table1
) union all
(select a, b, c, d from table2
) union all
. . .
) t
【讨论】:
无需重复 values 子句。如果 UNION ALL 在 CROSS APPLY 内完成,它应该对所有分支都有好处 @MartinSmith。 . .我正在尝试决定我是否喜欢任何一种方法。我的一部分说“真的很酷——它执行union
并填充缺失值。另一部分说“糟糕!对范围规则的破解太多了。”
嗯,这绝对是一个 hack,但它确实完成了工作,这对我来说已经足够了。
@asher 。 . .我也能理解这种需要。例如,如果表格代表每周生成的报告,基本上是相同的,但可能会随着时间的推移而变化(这就是为什么它们需要放在单独的表格中)。以上是关于具有所有字段名称和名称不存在的空值的 UNION的主要内容,如果未能解决你的问题,请参考以下文章
sql server 查询 order by 与 union 并替换多个列的空值
IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的“id”列中的空值