【问题标题】:Update using left join in netezza在 netezza 中使用左连接更新
【发布时间】:2015-05-25 11:47:05
【问题描述】:

我需要在更新期间对 netezza 中的两个表执行左连接。我怎样才能做到这一点?与三个表的左连接正在工作,但与两个表无关。

UPDATE table_1
SET c2 = t2.c2
FROM
    table_1 t1
    LEFT JOIN table_2.t1
    ON t1.c1=t2.c1
    LEFT JOIN table_3 t3
    ON t2.c1=t3.c1

这行得通,但是

UPDATE table_1
SET c2 = t2.c2
FROM table_1 t1
    LEFT JOIN table_2.t1
    ON t1.c1=t2.c1

这就像尝试更新多个列。

谢谢, 马尼拉蒂南。

【问题讨论】:

    标签: left-join insert-update netezza


    【解决方案1】:

    在 Netezza 中使用连接执行 UPDATE TABLE 时,重要的是要了解正在更新的表总是与 FROM 列表隐式地 INNER JOIN。这种行为是documented here

    您的代码实际上是将 table_1 连接到自身(一个没有别名的副本,一个以 t1 作为别名的副本)。由于这两个版本的 table_1 之间没有连接条件,因此您将获得一个交叉连接,它提供了尝试更新 table_1 的多行。

    使用 OUTER 连接处理 UPDATE 的最佳方法是使用这样的子选择:

    TESTDB.ADMIN(ADMIN)=> select * from table_1 order by c1;
     C1 | C2
    ----+----
      1 |  1
      2 |  2
      3 |  3
    (3 rows)
    
    TESTDB.ADMIN(ADMIN)=> select * from table_2 order by c1;
     C1 | C2
    ----+----
      1 | 10
      3 | 30
    (2 rows)
    
    
    TESTDB.ADMIN(ADMIN)=> UPDATE table_1 t1
    SET t1.c2 = foo.c2
    FROM (
          SELECT t1a.c1,
             t2.c2
          FROM table_1 t1a
             LEFT JOIN table_2 t2
             ON t1a.c1 = t2.c1
       )
       foo
    WHERE t1.c1 = foo.c1;
    UPDATE 3
    
    TESTDB.ADMIN(ADMIN)=> select * from table_1 order by c1;
     C1 | C2
    ----+----
      1 | 10
      2 |
      3 | 30
    (3 rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多