【问题标题】:Avoiding duplicate column names when using create table as select使用创建表作为选择时避免重复的列名
【发布时间】:2017-12-18 01:06:54
【问题描述】:

我目前正在尝试使用 CREATE Table AS SELECT 语句创建一个表。在 SELECT 语句中,当前有许多表(超过 10 个)的连接。

CREATE TABLE table_name AS 
    SELECT 
     * 
    FROM 
     table_x x
    LEFT JOIN 
     table_y y
     on x.id=y.fid 
    LEFT JOIN
     table_z z
     on x.id=z.fid
    ...
    ...
    ...

由于许多表共享列名(尽管不是数据),我收到了重复列名错误。

我想知道是否有一种懒惰的方式来生成列名,所以没有冲突。例如在上面的示例中,table_ytable_z 都有名为 fid 的列。

我想知道是否有一种方法可以在新表中生成名为 y.idz.id 的列,或类似的名称(例如 y_idz_id),而不仅仅是 idid ?

我想避免编写一个查询,其中我必须明确写出选择中的所有列,我们使用AS 语句如下:

CREATE TABLE table_name AS 
    SELECT 
     x.id as x_id,
     y.fid as y_fid,
     z.fid as z_fid,
     ...
     ...
     ...
    FROM 
     table_x x
    LEFT JOIN 
     table_y y
     on x.id=y.fid 
    LEFT JOIN
     table_z z
     on x.id=z.fid
    ...
    ...
    ...

【问题讨论】:

  • 最好的做法是写出列名,因为这样可以保护您在底层表结构发生变化时避免其他查询、函数和过程中断,并使脚本更易于维护 - 如果新开发人员有为了进行一些更改,如果脚本中已说明,他们更有机会知道要引入的内容。您甚至可能会发现新表中有一些您不需要的列,因此您不需要选择它们
  • 这个练习的一部分是对记录在多个表上的数据进行健全性检查,因此我们可以为每列加上每个表的标识符作为前缀。我完全理解我将在用于连接的列之间有重复的值,但是,这不会在生产环境中使用,并且对于这个用例来说,重复的内容并不是一个大问题。

标签: sql hive create-table


【解决方案1】:

也许我遗漏了一些东西,但为什么要选择本质上具有相同值的列?

代替:

SELECT x.id as x_id, y.fid as y_fid, z.fid as z_fid, . . .

为什么不只是?

SELECT x.id as x_id, . . .

您是否有需要 NULL 值的原因?我可以想象标志是否真的发生了匹配,但没有理由仅仅因为它们都存在就包含所有列。

【讨论】:

  • 该练习的目的是对数据进行健全性检查,但也对数据进行非规范化(在多个表中,到一个表中),这将允许我们基于非规范化数据创建多个视图。提高查询速度并降低 SQL 的复杂性。
  • 还有其他列由于连接而没有重复,但是,表中有超过 100 个不重复的列,因此不必手动显式地写出每个列名会很有用.在 select 语句中,其中一些列名确实会发生冲突,即使它们代表不同的数据。因此,为列添加表前缀很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多