当列数不相等而不将每个列定义为 NuLL 时,有没有办法在 Impala SQL 中合并两个表
Posted
技术标签:
【中文标题】当列数不相等而不将每个列定义为 NuLL 时,有没有办法在 Impala SQL 中合并两个表【英文标题】:Is there a way to Union Two tables in Impala SQL when No. of Columns are not equal without defining each Column as NuLL 【发布时间】:2021-09-18 09:54:26 【问题描述】:我有一个示例表,其中有大约 100 列。在其他表中,我有 20 列。这 20 列在两个表中都很常见。我想把两张桌子都联合起来。我这样做的方式是我必须选择 var1 as null,select var2 as null 等等,对于所有 80 列在表中不常见。有一个更好的方法吗。像所有不常见的列一样自动取 NUll 值? 谢谢
【问题讨论】:
没有。Union
的输入必须是具有匹配(或隐式可转换)数据类型的相同数量的列。
谢谢@Stu。这意味着对于表1 中不存在的80 列,我必须在表2 中将每个变量定义为NULL 以组合输出?这难道不是 SQL 的缺点吗?
如果您希望只存在于一个表中的 80 列在结果集中,它们必须同时存在于 select
查询中。是缺点吗?否 - 列仅按序号位置组合,而不是按名称或任何其他属性组合,猜测您想要什么不是查询优化器的工作。 - SQL 是一种声明性语言。在使用数据库的 25 年中,我从来没有需要过这个,这可能是您领域中的一个基本设计缺陷。
【参考方案1】:
您可以欺骗编译器使用left join
和using
生成列:
select *
from table1 t1 left join
(select t2.*
from table2 t2
where 1=0 -- an empty table but it has the additional columns
) t2
using (col1, col2, . . . , col20)
union all
select *
from t2;
注意:这假设用于匹配的前 20 列在两个表中的顺序相同。
【讨论】:
以上是关于当列数不相等而不将每个列定义为 NuLL 时,有没有办法在 Impala SQL 中合并两个表的主要内容,如果未能解决你的问题,请参考以下文章