Можно ли сделать SELECT ... FROM ... WHERE ... OR ... IN (проверка 2 условий в подзапросе)? - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу проверить, совпадает ли какой-либо из 2 столбцов моей таблицы с результатом подзапроса.В настоящее время я делаю SELECT ... FROM ... WHERE (var1 IN SUBQUERY или var2 IN SUBQUERY), и это работает.Но эти 2 подзапроса одинаковы, поэтому я думаю, что производительность можно улучшить, если бы я мог проверить, есть ли какой-либо из var1 или var2 в SUBQUERY.Можно ли это сделать, не выполняя подзапрос дважды?

Я пробовал что-то вроде SELECT ... ОТ ... ГДЕ var1 ИЛИ var2 В SUBQUERY, но это, конечно, не работает, потому что ГДЕ видит этокак 2 различных условия, таких как (var1) ИЛИ (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 ?)

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Вы можете вложить свой подзапрос в предложение 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) 
0 голосов
/ 06 апреля 2019

Не думаю, что это возможно, но, может быть, вам лучше использовать общее табличное выражение и в любом случае оставить соединения.

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. Так что, если оба имеют значение null, вы не включаете строку в окончательный результат. В зависимости от ваших данных, вам может понадобиться select distinct

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