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

标签 c sqlite

给出下表:

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“没有这样的列: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”绑定(bind)到参数,并逐步执行查询,那么我希望删除 ace 表的 (1, 9) 行。

是否可以在不先执行两次 SELECT 来获取 acl_id 和 users_id 值的情况下完成此操作?

最佳答案

在评论中链接的问答的帮助下,我能够提出看起来像功能性查询的内容:

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”

关于c - 如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159119/

相关文章:

c - C 中的基本指针?

c - 预响应参数 WTSSendMessage

c - 函数中的指针问题

c# - 如何使用 ServiceStack OrmLite 从 SQLite 读取 PRAGMA?

打开时出现 Swift 和 Sqlite3 错误

sqlite - 如何在PowerDesigner中从CDM模型生成sqlite数据库?

python - Cython:编译并找不到库 Mac OSX 10.12

c# - LINQ查询中的竞赛条件

swift - SQLite 插入 Swift 导致循环 Swift 3.1

c - 监控低级 Hook [C]