Можно ли сделать SELECT... FROM... WHERE... OR... IN(Проверка 2-х условий в подзапросе)?

Я хочу проверить, соответствует ли какой-либо из двух столбцов моей таблицы результату подзапроса. В настоящее время я делаю 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 ?)

Можете ли вы опубликовать код подзапроса?

forpas 06.04.2019 19:00

Показ фрагмента кода и запроса, который вы пробовали, будет иметь большое значение для получения ответа на ваш вопрос.

Hessam 06.04.2019 20:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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) 

Означает ли это, что подзапрос выполняется только один раз?

Muhammed 07.04.2019 01:01

Да, он выполняется только один раз.

forpas 07.04.2019 09:13

Другие вопросы по теме