【问题标题】:Postgres create table as from multiple joinsPostgres 从多个连接创建表
【发布时间】:2014-05-29 19:42:23
【问题描述】:

我有大量属性 (>15,000) 的数据挖掘问题。我用一个共同的 Id 字段表示多个表中的数据。删除空属性后,我想合并生成的较小表,以便计算相关性以删除冗余属性。
我可以通过以下方式轻松加入表格:

select * from lrg_bin0 k0
  join lrg_bin1 k1 on k0.id = k1.id
  join lrg_bin2 k2 on k0.id = k2.id
  join lrg_bin3 k3 on k0.id = k3.id

但是当我尝试创建一个新表时:

Create table mrg0 as (
  select * from lrg_bin0 k0
    join lrg_bin1 k1 on k0.id = k1.id
    join lrg_bin2 k2 on k0.id = k2.id
    join lrg_bin3 k3 on k0.id = k3.id
) 

Postgress 抱怨“列“id”指定了不止一次”

大量的属性意味着我正在以编程方式做所有事情,因此建议我可以生成的查询的答案将不胜感激。

【问题讨论】:

    标签: sql postgresql join create-table


    【解决方案1】:

    使用using 代替on

    create table mrg0 as 
    select *
    from
        lrg_bin0 k0
        join lrg_bin1 k1 using (id)
        join lrg_bin2 k2 using (id)
        join lrg_bin3 k3 using (id)
    

    From the manual:

    另外,USING 意味着每对等效列中只有一个将包含在连接输出中,而不是同时包含两个

    【讨论】:

    • 谢谢。这完美地完成了这项工作。
    【解决方案2】:

    问题在于,在 SQL 中,当您使用 on 执行连接时,匹配的列将在每个找到它的表中包含一次。您可以做的是指定您想要来自 ala 的列的表:

    Create table mrg0 as (
      select k1.id, ... from lrg_bin0 k0
        join lrg_bin1 k1 on k0.id = k1.id
        join lrg_bin2 k2 on k0.id = k2.id
        join lrg_bin3 k3 on k0.id = k3.id
    ) 
    

    【讨论】:

    • 我喜欢你的解决方案,因为它是明确的 vs USING 是隐含的。
    • 这种方法需要单独指定每一列,这在这种情况下是不切实际的。
    • 我“个人”不喜欢在我的代码中看到 * 就是这样。使用这种方法,我必须明确命名我的列并将它们命名为别名,以防止它们发生冲突或不包含重复的 id 列。当我阅读代码时,我会确切地知道哪些列被拉入了我的目标表。
    • @PaulSmith 这怎么不实用?因为你必须从你想要的表中说出你想要的id?
    • @ClodoaldoNeto 根据文档和您的回答“另外,USING 意味着每对等效列中只有一个包含在连接输出中,而不是两者都包含。”关键字被暗示。我不想暗示我是否可以明确表达。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多