使用联接条件更新SQL表

使用联接条件更新SQL表,sql,postgresql,Sql,Postgresql,假设你有桌子: CREATE TABLE TABLE1 (ID INTEGER PRIMARY KEY, VAL INT, CONDITION INT); CREATE TABLE TABLE2 (ID INTEGER PRIMARY KEY, VAL INT, CONDITION INT); 关于数据: INSERT INTO TABLE1 VALUES (0, 0, 100); 及 在这个查询之后,表1中会显示什么?为什么 UPDATE TABLE1 SET VAL = SOURCE.V

假设你有桌子:

CREATE TABLE TABLE1 (ID INTEGER PRIMARY KEY, VAL INT, CONDITION INT);
CREATE TABLE TABLE2 (ID INTEGER PRIMARY KEY, VAL INT, CONDITION INT);
关于数据:

INSERT INTO TABLE1 VALUES (0, 0, 100);

在这个查询之后,表1中会显示什么?为什么

UPDATE TABLE1 SET VAL = SOURCE.VAL 
FROM TABLE2 SOURCE 
WHERE TABLE1.CONDITION = SOURCE.CONDITION
我得到:

0;2;100
这是否意味着RDBMS执行了几次
UPDATE
操作,我只看到了最终结果?或者它只更新一次
VAL

说明:

"Update on table1  (cost=270.68..562.65 rows=18818 width=24)"
"  ->  Merge Join  (cost=270.68..562.65 rows=18818 width=24)"
"        Merge Cond: (table1.condition = source.condition)"
"        ->  Sort  (cost=135.34..140.19 rows=1940 width=14)"
"              Sort Key: table1.condition"
"              ->  Seq Scan on table1  (cost=0.00..29.40 rows=1940 width=14)"
"        ->  Sort  (cost=135.34..140.19 rows=1940 width=14)"
"              Sort Key: source.condition"
"              ->  Seq Scan on table2 source  (cost=0.00..29.40 rows=1940 width=14)"
我使用了PostgreSQL。

来自:

目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测

因此,您看到的行为正是应该发生的。

来自:

目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测

因此,您看到的行为正是应该发生的。

来自:

目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测

因此,您看到的行为正是应该发生的。

来自:

目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测


因此,您看到的行为正是应该发生的。

您的问题似乎是当表中有多个匹配项被更新时会发生什么。在输出中只设置一个值。任意匹配行用于更新

报告解释了发生的情况:

注释

当存在FROM子句时,本质上发生的是 目标表已连接到from_列表中提到的表,并且 联接的每一输出行都表示 目标表。使用FROM时,应确保联接产生 要修改的每行最多一个输出行。换句话说,一个 目标行不应从另一行连接到多个行 表(s)。如果是,则只有一个联接行将用于 更新目标行,但将使用哪一行并不容易 可预测的

由于这种不确定性,只能在 sub-select更安全,但通常更难阅读,速度比 使用连接


您的问题似乎是当更新表中的多个匹配项时会发生什么。在输出中只设置一个值。任意匹配行用于更新

报告解释了发生的情况:

注释

当存在FROM子句时,本质上发生的是 目标表已连接到from_列表中提到的表,并且 联接的每一输出行都表示 目标表。使用FROM时,应确保联接产生 要修改的每行最多一个输出行。换句话说,一个 目标行不应从另一行连接到多个行 表(s)。如果是,则只有一个联接行将用于 更新目标行,但将使用哪一行并不容易 可预测的

由于这种不确定性,只能在 sub-select更安全,但通常更难阅读,速度比 使用连接


您的问题似乎是当更新表中的多个匹配项时会发生什么。在输出中只设置一个值。任意匹配行用于更新

报告解释了发生的情况:

注释

当存在FROM子句时,本质上发生的是 目标表已连接到from_列表中提到的表,并且 联接的每一输出行都表示 目标表。使用FROM时,应确保联接产生 要修改的每行最多一个输出行。换句话说,一个 目标行不应从另一行连接到多个行 表(s)。如果是,则只有一个联接行将用于 更新目标行,但将使用哪一行并不容易 可预测的

由于这种不确定性,只能在 sub-select更安全,但通常更难阅读,速度比 使用连接


您的问题似乎是当更新表中的多个匹配项时会发生什么。在输出中只设置一个值。任意匹配行用于更新

报告解释了发生的情况:

注释

当存在FROM子句时,本质上发生的是 目标表已连接到from_列表中提到的表,并且 联接的每一输出行都表示 目标表。使用FROM时,应确保联接产生 要修改的每行最多一个输出行。换句话说,一个 目标行不应从另一行连接到多个行 表(s)。如果是,则只有一个联接行将用于 更新目标行,但将使用哪一行并不容易 可预测的

由于这种不确定性,只能在 sub-select更安全,但通常更难阅读,速度比 使用连接

这取决于目标。 在这种情况下,当涉及表时,它将选择一个记录匹配项(主要是第一个)并使用它。 您可以通过在表1上创建触发器来验证它,并标记记录被更改的次数。 如果目标不是一个表而是一个变量,那么更新将按每行进行。这
"Update on table1  (cost=270.68..562.65 rows=18818 width=24)"
"  ->  Merge Join  (cost=270.68..562.65 rows=18818 width=24)"
"        Merge Cond: (table1.condition = source.condition)"
"        ->  Sort  (cost=135.34..140.19 rows=1940 width=14)"
"              Sort Key: table1.condition"
"              ->  Seq Scan on table1  (cost=0.00..29.40 rows=1940 width=14)"
"        ->  Sort  (cost=135.34..140.19 rows=1940 width=14)"
"              Sort Key: source.condition"
"              ->  Seq Scan on table2 source  (cost=0.00..29.40 rows=1940 width=14)"