Как удалить строки в sqlite с предложением WHERE, которое ссылается на несколько таблиц? - PullRequest
1 голос
/ 16 мая 2019

Учитывая следующие таблицы:

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' с параметрами, ичтобы выполнить запрос, я бы ожидал, что строка (1, 9) таблицы ace будет удалена.

Можно ли это сделать, не выполнив сначала два SELECT, чтобы получить значения acl_id и users_id?

1 Ответ

1 голос
/ 16 мая 2019

С некоторой помощью связанных 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 языков запросов"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...