我在下面的SQL语句中有一个我正在Oracle数据库上运行的数据库,我希望将它放在一个存储过程中,以便通过Java语句调用。但是,我想先让查询工作。我有几个表有数据,我的查询应该在执行Delete语句之前通过Inner Joins满足一些条件。所以,这是我构建的第一个查询。我一直在“SQL命令未正确结束”错误:
Delete from ur
from ATESTuser_roles ur
Inner Join ATESTresource_roles rr
on ur.role_id = rr.role_id
Inner Join ATESTRESOURCES r
on rr.resource_id=r.RESOURCE_ID
where r.name='TestName'
and ur.user_id = '1401'
我也尝试过这个版本,它仍然可以工作。我得到了 "ATESTRESOURCES"."RESOURCE_ID": invalid identifier error
:
Delete from ATESTuser_roles
where ATESTuser_roles.role_id = ATESTresource_roles.role_id
and ATESTresources.name='TestName'
and ATESTresource_roles.resource_id=ATESTRESOURCES.RESOURCE_ID
and ATESTuser_roles.user_id = '1401'
我有一种感觉,我错过了一些小而重要的东西,而且我缺少一些语法,所以非常感谢任何帮助。
P.S:我不知道如何描述表之间的关系而不是查询中的条件。但是,如果不清楚,我可以添加其他信息(不想把它变得过于冗长)。
非常感谢!
答案 0 :(得分:1)
在Oracle中,您无法像这样在delete
中加入多个表。一个选项可能是
Delete ATESTuser_roles ur
where exists( select 1
from ATESTresource_roles rr
join ATESTRESOURCES r
on rr.resource_id=r.RESOURCE_ID
where ur.role_id = rr.role_id
and r.name='TestName'
and ur.user_id = '1401' )
答案 1 :(得分:0)
另一种解决方案是在ATESTuser_roles表中声明ON DELETE CASCADE。完成此操作后,您只需运行此查询:
DELETE FROM ATESTuser_roles
WHERE user_id = '1401'
由于ON DELETE CASCADE,DB将删除ATESTresource_roles中外键(user_id)等于1401的任何元组。