【问题标题】:SQL join eliminating repeated columnsSQL连接消除重复列
【发布时间】:2015-08-14 13:31:59
【问题描述】:

所以我处理了几张表,这些表都是从一个普通的表中生成的。

他们的架构如下

T1: A, B, C, M, N T2: A, B, J, M T3: A, C, M, P

并且预期的结果是所有表的合并版本,丢弃了重复的值。

R: T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P

幸运的是,行的属性在同名列上重合,即。

T1.A == T2.A == T3.A 跨所有行

T1.B = T2.B 跨所有行

等等

将这些表连接到单个 R 表中的查询是什么,只保留上面唯一命名的列?

【问题讨论】:

  • 只选择加入表格时需要的列,例如 Select t1.A,t2.j.......(加入表格)。
  • 在您的选择语句中简单地命名您需要的列:t1.A, t1.B, t1.c
  • 只是为了好玩,请查看 NATURAL JOIN。
  • @jarlh 正是我想要的,SELECT * FROM T1 NATURAL JOIN T2 NATURAL JOIN T3;

标签: sql postgresql join


【解决方案1】:
select T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P
from t1 join t2 
on t1.A = t2.A and t1.B = t2.B and t1.M = t2.M
join t3 on
t1.A = t3.A and t1.C = t3.C and t1.M = t3.M

您必须join 表。

【讨论】:

    【解决方案2】:

    基本查询是:

     SELECT T1.A, T1.B, T1.C, T2.J, T1.M, T1.N, T3.P
     FROM T1
     INNER JOIN T2 ON T1.A=T2.A and T1.B=T2.B and T1.M=T2.M
     INNER JOIN T3 ON T1.A=T3.A and T1.C=T3.C and T1.M=T3.M
    

    您对每个内部联接设置的条件数应等于使其成为该表的唯一行的所有列。例如,如果 A、B 和 M 足以使其独一无二,那么您必须使用它们。索引覆盖范围(作为单独的或完全聚集的)应包含使它们一起唯一的这些字段。

    【讨论】:

      【解决方案3】:

      虽然其他解决方案是正确的,但更优雅的版本应该是

      SELECT *
      FROM T1
      NATURAL JOIN T2
      NATURAL JOIN T3
      

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 2017-07-02
        • 2014-12-31
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 2021-06-04
        • 2017-09-17
        • 1970-01-01
        相关资源
        最近更新 更多