【问题标题】:Postgresql: How to join to table not referenced in from clause?Postgresql:如何加入未在 from 子句中引用的表?
【发布时间】:2020-07-09 09:11:54
【问题描述】:

我有一个 postgres 数据库,我偶尔会在其中运行以下查询:

UPDATE b_address ba
SET op_id = op.land_id
FROM openb op
WHERE ba.str = op.name
AND (ba.openb_id IS NULL OR ba.openb_id = '');

这可行,但我现在只想对表b_address 中的记录执行此操作,其中source 等于"E"。然而,源存储在另一个名为b_b 的表中,我可以像这样加入b_address

SELECT ba.id, bb.source
FROM b_address ba
JOIN b_b bb ON bb.id = ba.bb_id
WHERE bb.source = 'E';

我现在正努力将此联接添加到 UPDATE 查询中,以便仅更新来自 b_address 且具有 source = 'E' 的记录。

我试过了:

UPDATE b_address ba
SET op_id = op.land_id
FROM openb op
JOIN b_b bb ON bb.id = ba.bb_id
WHERE bb.source = 'E'
AND ba.str = op.name
AND (ba.openb_id IS NULL OR ba.openb_id = '');

但是我得到了这个:

ERROR: invalid reference to FROM-clause entry for table "ba"
  Hint: There is an entry for table "ba", but it cannot be referenced from this part of the query.

这是有道理的,因为表总是在FROM 子句中连接到表。不过,我不确定如何将它们组合在一起。

关于如何进行的任何提示?

【问题讨论】:

    标签: sql postgresql join sql-update


    【解决方案1】:

    嗯。 . .一种方法是cross join

    UPDATE b_address ba
        SET op_id = op.land_id
        FROM openb op CROSS JOIN
             b_b bb 
        WHERE bb.id = ba.bb_id AND
              bb.source = 'E' AND
              ba.str = op.name AND
              (ba.openb_id IS NULL OR ba.openb_id = '');
    

    另一种选择是子查询:

    UPDATE b_address ba
        SET op_id = op.land_id
        FROM openb op
        WHERE ba.str = op.name AND
              (ba.openb_id IS NULL OR ba.openb_id = '') AND
              EXISTS (SELECT 1 FROM b_b bb WHERE bb.id = ba.bb_id AND bb.source = 'E');
    

    我实际上比第一个更喜欢这种结构。

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 2019-12-22
      • 2011-03-01
      • 2018-03-06
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多