基于SQL

时间:2016-02-15 23:55:02

标签: sql database oracle

我在下面的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:我不知道如何描述表之间的关系而不是查询中的条件。但是,如果不清楚,我可以添加其他信息(不想把它变得过于冗长)。

非常感谢!

2 个答案:

答案 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的任何元组。

ON DELETE CASCADE example