为什么SQL UPDATE on JOIN会更新每个条目,但SELECT会选择正确的条目
我正在尝试基于另一个表更新一个表。下面的SQL更新了为什么SQL UPDATE on JOIN会更新每个条目,但SELECT会选择正确的条目,sql,postgresql,join,sql-update,Sql,Postgresql,Join,Sql Update,我正在尝试基于另一个表更新一个表。下面的SQL更新了myTableA中的每个条目,而我希望它在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 = tr
myTableA
中的每个条目,而我希望它在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
无论MTB.active处于何种状态,上述代码都会在MTA中更新1000个条目。但是,如果前4行被替换为SELECT*
,那么它将只选择500行,这与预期的一样
如何仅更新
MTA
中的条目,其中MTB.active=true
?编写此查询的正确方法是:
UPDATE myTableA MTA
SET myTableA.enabled = false
FROM myTableB MTB
WHERE MTA.user_id = MTB.user_id AND MTB.active = true;
UPDATE
中对myTableA
的引用和来自的是不同的引用。因此,您的查询正在进行交叉联接。在选择中,这相当于:
FROM MyTableA update_A CROSS JOIN
(myTableA MTA FULL JOIN
myTableB MTB
ON MTA.user_id = MTB.user_id
)
WHERE MTB.active = true
显然,过滤器与正在更新的表无关
还有两点。首先,在更新中不太可能使用完全联接。通常,行需要匹配才能进行任何更新。而且,=true
是冗余的active
显然是一个布尔列,因此它可以用作完整的布尔表达式。您的查询应如下所示:
UPDATE myTableA MTA
SET myTableA.enabled = false
FROM myTableB MTB
WHERE MTA.user_id = MTB.user_id AND MTB.active = true
在这里,相关子查询可能已经足够好了:
update mytableA
set enabled = false
where exists (
select 1
from mytableB mtb
where mtb.user_id = mytableA.user_id and mtb.active = true
)
请问当前输入和预期输出?“除非您打算自行加入,否则不要将目标表作为from_项重复。”谢谢。我很快会接受答案。也谢谢你的加入解释。我会在下次请求帮助之前读更多。至少值得在评论中指出的是,这种行为不同于SQL Server,SQL Server还支持UPDATE
语句中的from
子句。在SQL Server中,除了不必要的外部联接之外,您的代码将执行预期的操作。@ReactHelp。在更新中
。谢谢。上面定义的MTA在哪里?SQL足够聪明,可以知道它是myTableA吗?@ReactHelp MTA iq只是一个例子alias@GordonLinoff为什么?