如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?

Posted

技术标签:

【中文标题】如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?【英文标题】:How to delete rows in sqlite with a WHERE clause that references multiple tables? 【发布时间】:2019-10-03 04:11:55 【问题描述】:

给定以下表格:

acl (acl_id integer, name character)
ace (acl_id integer, users_id integer)
users (users_id integer, login character)

还有一些示例数据:

acl (0, 'view') (1, 'sell'), (2, 'void')
ace (0, 9), (1, 9), (2, 9), (0, 8)
users (8, 'joe') (9, 'john')

我尝试了以下方法:

DELETE FROM ace
  WHERE ace.acl_id = acl.acl_id AND acl.name = ?
    AND ace.users_id = users.users_id AND users.login = ?

但这在sqlite3_prepare_v2() 中失败,SQLITE_ERROR "no such column: acl.acl_id" (这不是很有帮助)

我得到相同的结果:

DELETE FROM ace
  WHERE acl_id = acl.acl_id AND acl.name = ?
    AND users_id = users.users_id AND users.login = ?

谢天谢地,可怕的:

DELETE FROM ace,acl,users
  WHERE ace.acl_id = acl.acl_id AND acl.name = ?
    AND ace.users_id = users.users_id AND users.login = ?

第一个逗号出现语法错误而失败。

如果我能够将值 'sell' 和 'john' 绑定到参数,并逐步执行查询,那么我希望删除 ace 表的 (1, 9) 行。

这是否可以在不先执行两个 SELECT 以获取 acl_id 和 users_id 值的情况下完成?

【问题讨论】:

您需要加入表格。请参阅this question 及其答案作为示例。 使用内部连接删除在 sqlite 中很棘手(SQLite 不支持直接语法)...这是 ***.com/questions/24511153/… 的副本 How delete table inner join with other table in Sqlite?的可能重复 @KenWhite 这是 sqlite 中的语法错误 @JohnHascall:这就是我没有发布答案的原因。 :-) 我在这台机器上没有 SQLite 来测试它。 【参考方案1】:

在 cmets 中链接的 Q/A 的帮助下,我能够想出一个看似功能性的查询:

DELETE FROM ace
 WHERE acl_id = (
       SELECT acl_id
         FROM acl
        WHERE name = ?
   )
   AND users_id = (
       SELECT users_id
         FROM users
        WHERE login = ?
   )

我不得不说,这太荒谬了。

“SQL,查询语言的 EBCDIC”

【讨论】:

以上是关于如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?

如何使用 Where 子句从多个表中删除多行?

在 FROM 子句中引用别名为表的其他 SQL SELECT 语句

使用JPA在Sql中具有不同值的多个语句where子句

当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?

如何在sql中创建动态where子句?