甲骨文:需要存在于相关更新中
Oracle: Need for exists in correlated update
我正在SQL练习下面的link
https://oracle-base.com/articles/misc/updates-based-on-queries
在子查询方法中,代码如下
UPDATE dest_tab tt
SET (tt.code, tt.description) = (SELECT st.code, st.description
FROM source_tab st
WHERE st.id = tt.id)
WHERE EXISTS (SELECT 1
FROM source_tab
WHERE id = tt.id);
关联部分使用join我能理解,但是EXISTS操作符有什么用。根据文章,它应该排除在更新目标 table 时不匹配的记录。但是那应该通过连接条件来处理,对吧?那只是在源和目标之间具有匹配 id 的记录。这是因为 WHERE 子句是强制性的,以避免更新完整的 table,即使我们在源和目标之间有一个等连接?
如果没有 exists
,您将更新 dest_tab
中的每一行。因此,如果 dest_tab
中有任何行在 source_tab
中没有匹配行,它们的列将设置为空:
create table t1 (
c1 int, c2 int
);
create table t2 (
c1 int, c2 int
);
insert into t1 values ( 1, 1 );
insert into t1 values ( 2, 2 );
insert into t2 values ( 1, 999 );
commit;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 <null>
添加 exists
子句可避免此问题:
rollback;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
)
where exists (
select null from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 2
我正在SQL练习下面的link https://oracle-base.com/articles/misc/updates-based-on-queries
在子查询方法中,代码如下
UPDATE dest_tab tt
SET (tt.code, tt.description) = (SELECT st.code, st.description
FROM source_tab st
WHERE st.id = tt.id)
WHERE EXISTS (SELECT 1
FROM source_tab
WHERE id = tt.id);
关联部分使用join我能理解,但是EXISTS操作符有什么用。根据文章,它应该排除在更新目标 table 时不匹配的记录。但是那应该通过连接条件来处理,对吧?那只是在源和目标之间具有匹配 id 的记录。这是因为 WHERE 子句是强制性的,以避免更新完整的 table,即使我们在源和目标之间有一个等连接?
如果没有 exists
,您将更新 dest_tab
中的每一行。因此,如果 dest_tab
中有任何行在 source_tab
中没有匹配行,它们的列将设置为空:
create table t1 (
c1 int, c2 int
);
create table t2 (
c1 int, c2 int
);
insert into t1 values ( 1, 1 );
insert into t1 values ( 2, 2 );
insert into t2 values ( 1, 999 );
commit;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 <null>
添加 exists
子句可避免此问题:
rollback;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
)
where exists (
select null from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 2