具有所有字段名称和名称不存在的空值的 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”列中的空值

SQL Server的空值处理策略

那些年我们踩过的坑,SQL 中的空值陷阱!

连接具有空值的汇总数据 - SQL Server