当列数不相等而不将每个列定义为 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 joinusing 生成列:

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 中合并两个表的主要内容,如果未能解决你的问题,请参考以下文章

当列数少于列数时,Chrome 列错误

当列数未知时,如何在多个列上连接两个表(pyspark)

Union All 的列数不匹配

sql插入的列数不确定怎么办

在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

当列数事先未知时如何访问 Pandas 数据框列