【问题标题】:UNION with all field names and nulls where names don't exist具有所有字段名称和名称不存在的空值的 UNION
【发布时间】: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 列都有相同的定义;如果他们不这样做,那么这本身就是一个设计缺陷。

标签: sql sql-server


【解决方案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 。 . .我也能理解这种需要。例如,如果表格代表每周生成的报告,基本上是相同的,但可能会随着时间的推移而变化(这就是为什么它们需要放在单独的表格中)。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多