【问题标题】:Trying to delete from multiple tables using SQL尝试使用 SQL 从多个表中删除
【发布时间】:2014-07-28 04:30:52
【问题描述】:

我们的应用程序中有 4 个表:

  • 用户
  • 使用会话
  • upklist
  • 项目共享

最后三个表包含一个名为 session_id 的字段。

在下面的代码中,括号中的部分用于从usession 表中为用户“awpeople”获取所有session_id 值。

问题是我如何将这个结果集读入一个数组并从数组结果中session_id 所在的所有三个表中删除。

代码:

DELETE FROM usession, 
            upklist, 
            projshar 
WHERE  session_id = (SELECT session_id 
                     FROM   usession 
                     WHERE  delete_session_id IS NULL 
                            AND user_id = (SELECT user_id 
                                           FROM   users 
                                           WHERE  REGEXP_LIKE(USER_NAME, 
                                                  'awpeople', 'i'))); 

【问题讨论】:

  • 您能说明一下您要达到的目标吗?您提到将结果读入数组听起来像是一个尝试的解决方案,而不是实际的问题。如果你需要从 3 个表中删除,你只需要运行 3 个删除语句。
  • 您只能在任何给定时间从单个表中删除 - 可以同时从多个表中删除
  • 添加了oracle标签,因为regexp_like

标签: sql oracle sql-delete


【解决方案1】:

delete 一次只能处理一个表,因此您需要三个语句:

DELETE FROM upklist 
WHERE  session_id = (SELECT session_id 
                     FROM   usession 
                     WHERE  delete_session_id IS NULL 
                            AND user_id = (SELECT user_id 
                                           FROM   users 
                                           WHERE  REGEXP_LIKE(USER_NAME, 
                                                  'awpeople', 'i'))); 

DELETE FROM projshar 
WHERE  session_id = (SELECT session_id 
                     FROM   usession 
                     WHERE  delete_session_id IS NULL 
                            AND user_id = (SELECT user_id 
                                           FROM   users 
                                           WHERE  REGEXP_LIKE(USER_NAME, 
                                                  'awpeople', 'i'))); 

DELETE FROM usession 
WHERE  session_id = (SELECT session_id 
                     FROM   usession 
                     WHERE  delete_session_id IS NULL 
                            AND user_id = (SELECT user_id 
                                           FROM   users 
                                           WHERE  REGEXP_LIKE(USER_NAME, 
                                                  'awpeople', 'i'))); 

请注意,由于内部查询依赖于usersession,您应该从它last中删除。

【讨论】:

【解决方案2】:

多表语法:

删除 [LOW_PRIORITY] [快速] [忽略] tbl_name[.] [, tbl_name[.]] ... FROM table_references [WHERE where_condition]

或者:

删除 [LOW_PRIORITY] [快速] [忽略] FROM tbl_name[.] [, tbl_name[.]] ... 使用 table_references [WHERE where_condition]

这来自 Oracle 的MySQL 5.1 DELETE documentation

【讨论】:

  • 链接(现在导致错误 404)似乎是针对 MySQL 的,而问题是关于 Oracle DB。
【解决方案3】:

如果usession在session_id上有一个唯一键或主键,并且其他表与它有外键关系,那么您可以从usession中删除该行,并让数据库将其级联到子表。

【讨论】:

  • 我已经在 MySQL 中做了这个,你知道它在 Oracle 中是否会以同样的方式工作?
  • 是的:在外键上级联删除几乎是一个标准的 RDBMS 功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多