Я хочу проверить, соответствует ли какой-либо из двух столбцов моей таблицы результату подзапроса. В настоящее время я делаю SELECT... FROM... WHERE (var1 IN SUBQUERY ИЛИ var2 IN SUBQUERY), и это работает. Но эти 2 подзапроса одинаковы, поэтому я думаю, что производительность можно было бы улучшить, если бы я мог проверить, находится ли какой-либо из var1 или var2 в ПОДЗАПРОСЕ. Можно ли это сделать, не выполняя подзапрос дважды?
Я пробовал что-то вроде SELECT... FROM... WHERE var1 OR var2 IN SUBQUERY, но это, конечно, не работает, потому что WHERE видит это как 2 разных условия, например (var1) OR (var2 IN SUBQUERY). Запрос, который в настоящее время работает, и я хочу повысить производительность, приведен ниже:
SELECT table1.id FROM table1 WHERE (table1.first IN (SELECT table2.id FROM table2 WHERE (table2.xCord BETWEEN ? AND ?) AND (table2.yCord BETWEEN ? AND ?)) OR table1.second IN (SELECT table2.id FROM table2 WHERE (table2.xCord BETWEEN ? AND ?) AND (table2.yCord BETWEEN ? AND ?)))
Итак, подзапрос таков:
SELECT table2.id FROM table2 WHERE (table2.xCord BETWEEN ? AND ?) AND (table2.yCord BETWEEN ? AND ?)
Показ фрагмента кода и запроса, который вы пробовали, будет иметь большое значение для получения ответа на ваш вопрос.
Я не думаю, что это возможно, но, возможно, вам лучше использовать общее табличное выражение и левые соединения в любом случае.
https://www.sqlite.org/lang_with.html
with subquery as (select col ....)
select table.* from table
left join subquery s1 on table.var1 = s1.col
left join subquery s2 on table.var2 = s2.col
where not (s1.col is null and s2.col is null)
Это выполняет запрос только один раз, левое соединение содержит все строки из таблицы. Если в подзапросе нет строки для присоединения к var1, s1.col имеет значение null. Аналогично для s2. Поэтому, если оба значения равны нулю, вы не включаете строку в окончательный результат. В зависимости от ваших данных, вам может понадобиться select distinct
Вы можете вложить свой подзапрос в предложение WITH
и использовать CTE следующим образом:
with cte as (
SELECT id FROM table2
WHERE (xCord BETWEEN ? AND ?) AND (yCord BETWEEN ? AND ?)
)
SELECT id FROM table1
WHERE (first IN cte) OR (second IN cte)
Означает ли это, что подзапрос выполняется только один раз?
Да, он выполняется только один раз.
Можете ли вы опубликовать код подзапроса?