Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL UPDATE on JOIN会更新每个条目,但SELECT会选择正确的条目_Sql_Postgresql_Join_Sql Update - Fatal编程技术网

为什么SQL UPDATE on JOIN会更新每个条目,但SELECT会选择正确的条目

为什么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

我正在尝试基于另一个表更新一个表。下面的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 = 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为什么?