Ссылочный подзапрос несколько раз

#sql #sqlite

#sql #sqlite

Вопрос:

Упрощенная версия инструкции, которую я пытаюсь выполнить ( a , b и m — это таблицы, в которых только один столбец содержит целые числа):

 SELECT * FROM m WHERE 
    c1 IN (SELECT * FROM a) OR
    c1 IN (SELECT * FROM b)
    AND (NOT c1 IN (SELECT * FROM a) 
         OR  c1 IN (SELECT * FROM b));
  

Я знаю, что это можно было бы сделать проще, но я должен сохранить эту структуру (т. Е., например, не могу присоединиться). Как я мог бы избежать повторения подзапросов после И НЕ, поскольку они вернут тот же набор, что и предыдущие?

Комментарии:

1. Разве sqlite не оптимизирует это?

2. Совсем не уверен. Хотя это было бы интересно узнать.

3. Даже если бы это произошло, вопрос остался бы — помимо оптимизации, вы обычно не хотите иметь повторяющиеся биты кода, которые усложнили бы обслуживание вашего запроса.

4. Мне нужно сделать это в одном операторе. Более того, представления не индексируются в SQLite.