gpt4 book ai didi

oracle - 如何使用 Oracle 中的联接从一个表中删除数据?

转载 作者:行者123 更新时间:2023-12-01 04:34:34 26 4
gpt4 key购买 nike

我正在尝试从一个具有连接条件的表中删除数据。

我试过了

Delete test_one from test_one Val 
join test_two En
on Val.Map_Fromphyid=En.Fromphyid And
Val.Map_Tophyid=En.Tophyid And
Val.Map_Relname=En.Relname
Where Val.Result='NOT Done'

但这给了我这个错误

"SQL command not properly ended"

我知道我可以通过这种方式做到这一点

Delete From test_one 
Where Phyid In (Select Val.Phyid From test_one Val
join test_two En
on Val.Map_Fromphyid=En.Fromphyid And
Val.Map_Tophyid=En.Tophyid And
Val.Map_Relname=En.Relname
Where Val.Result='NOT Done');

第一种方法有什么问题?如果不正确,如何在没有子查询的情况下实现该目标?

我看过这个question .我正在寻找其中没有任何子查询的查询。我只通过子查询找到了答案。

最佳答案

您正在动态创建一个 View (即,不是从表中删除 delete from t 您想要从查询中获得的记录中删除 delete from <query>

为了从这样的临时 View 中进行选择,您需要括号(例如 select * from (select from b) 而不是 select * from select from b

对于 UPDATE 语句,它是一样的。所以要么从表中删除:

delete [from] test_one where ...

或从 View

delete [from] (select * from test_one ...)

但是不要忘记括号。并且不要像在

中那样同时命名表 View
delete [from] test_one [from] (select * from test_one ...)

这就是你在做什么。

我发现最好尽可能直接从表中删除,因为在 Oracle 中从临时 View 中删除对我来说似乎有些模糊,我认为它的可读性较差:

  • delete from (select * from a join b on a.x = b.x)
  • 中删除
  • delete from (select * from b join a on a.x = b.x)从 b 中删除
  • delete from (select a.* from b join a on a.x = b.x)
  • 中删除

这至少是我的 Oracle 版本 11g 中发生的情况。

至于你的DELETE语句,我建议这样写:

delete from test_one val 
where result = 'NOT Done'
and exists
(
select *
from test_two en
where en.fromphyid = val.map_fromphyid
and en.tophyid = val.map_tophyid
and en.relname = val.map_relname
);

我认为这是可读的:从表 test_one 中删除所有“未完成”记录,表 test_two 中也存在一个条目。

关于oracle - 如何使用 Oracle 中的联接从一个表中删除数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32050437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com