首页 > 解决方案 > 为什么 JOIN 上的 SQL UPDATE 更新每个条目,但 SELECT 选择正确的条目

问题描述

我正在尝试根据另一个表更新一个表。以下 SQLmyTableA会在我期望它更新 where 时更新每个条目myTableB.active = true

  UPDATE
    myTableA
  SET
    myTableA.enabled = false
  FROM
    myTableA MTA
  FULL OUTER JOIN
    myTableB MTB
  ON
    MTA.user_id = MTB.user_id
  WHERE
    MTB.active = true

上面的代码更新了 1000 个 int MTA 条目,无论MTB.active. 但是,如果前 4 行被替换为SELECT *,那么它只选择 500 行,正如预期的那样。

如何仅更新MTAwhere 中的条目MTB.active = true

标签: sqlpostgresqljoinsql-update

解决方案


编写此查询的正确方法是:

UPDATE myTableA MTA
  SET myTableA.enabled = false
  FROM myTableB MTB
  WHERE MTA.user_id = MTB.user_id AND MTB.active = true;

myTableA中的引用是不同的引用。因此,您的查询正在执行. 在 a中,这相当于:UPDATEFROMCROSS JOINSELECT

FROM MyTableA update_A CROSS JOIN
     (myTableA MTA FULL JOIN
      myTableB MTB
      ON MTA.user_id = MTB.user_id
     )
    WHERE MTB.active = true

显然,过滤器与正在更新的表无关。

还有两点。首先,不太可能在 aFULL JOIN中使用 a UPDATE。通常,行需要匹配才能发生任何更新。此外,= true是多余的。 active显然是一个布尔列,所以它可以作为一个完整的布尔表达式。


推荐阅读