SQLite: УДАЛИТЬ по нескольким критериям WHERE из запроса - PullRequest
0 голосов
/ 02 марта 2020

У меня есть база данных SQLite, где мне нужно удалить записи из таблицы «многие ко многим», основываясь на результатах запроса, где должны быть соблюдены 2 критерия для каждой строки.

В качестве примера возьмем 2 таблицы :

    oldEvents              <select_query>

user_id  | event_id       qry_user_id  | qry_event_id
---------+----------      -------------+-------------
       1 | aaa                      2  | aaa
       2 | aaa                      3  | bbb
       2 | bbb                      1  | ccc
       3 | bbb
       1 | ccc
       3 | ccc

Из таблицы oldEvents я хочу удалить каждую строку, которая появляется в запросе, чтобы получилось:

    oldEvents             

user_id  | event_id   
---------+----------   
       1 | aaa       
       2 | bbb         
       3 | ccc

До сих пор я использовал громоздкий DELETE запрос, который объединяет qry_user_id и qry_event_id и использует их в подпункте EXISTS:

DELETE FROM oldEvents
WHERE EXISTS
(
   SELECT user_id||event_id AS deleteCombo
   FROM oldEvents
   WHERE deleteCombo IN
   (
      SELECT qry_user_id||qry_event_id
      FROM
      <select_query>
   ) 
)

Это работает, но трудно читаемо и не масштабируется, если в сцену попадет еще одна переменная.

Я не могу повторить строку select_query в предложении AND, поскольку сам по себе это довольно сложный запрос (triple-JOIN).

Я мог бы записать данные запроса во временную таблицу, но предпочел бы не делать этого.

Кто-нибудь предлагает, как написать DELETE, которая принимает несколько критериев WHERE из запроса?

1 Ответ

1 голос
/ 02 марта 2020

Заключите ваш запрос в CTE, например:

WITH cte(user_id, event_id) AS (
  <your query here>
)
DELETE FROM oldEvents
WHERE (user_id, event_id) IN (SELECT user_id, event_id FROM cte);

См. Демоверсию . Результаты:

SELECT * FROM oldEvents;

| user_id | event_id |
| ------- | -------- |
| 1       | aaa      |
| 2       | bbb      |
| 3       | ccc      |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...