sql - 为什么 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 行,正如预期的那样。
如何仅更新MTA
where 中的条目MTB.active = true
?
解决方案
编写此查询的正确方法是:
UPDATE myTableA MTA
SET myTableA.enabled = false
FROM myTableB MTB
WHERE MTA.user_id = MTB.user_id AND MTB.active = true;
和myTableA
中的引用是不同的引用。因此,您的查询正在执行. 在 a中,这相当于:UPDATE
FROM
CROSS JOIN
SELECT
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
显然是一个布尔列,所以它可以作为一个完整的布尔表达式。