#java #sqlite
#java #sqlite
Вопрос:
Я пытаюсь сравнить, равен ли один столбец моей таблицы тому, что возвращает подзапрос в нескольких столбцах. Я хочу иметь возможность возвращать строки, если table1.id равно одному из table2.first или table2.second. Какой был бы допустимый синтаксис для этого?
Я пробовал то, что приведено ниже, но это недопустимый синтаксис, поскольку я получаю «Результат: вложенный выбор возвращает 2 столбца — ожидаемый 1».
SELECT table1.id, table1.attr1, table1.attr2 FROM table1 WHERE table1.id IN (SELECT table2.first, table2.second FROM table2 WHERE type != "..." AND type != "someType")
Ответ №1:
Возможно, вы намереваетесь сделать что-то вроде этого:
SELECT
t1.id,
t1.attr1,
t1.attr2
FROM table1 t1
WHERE
EXISTS (SELECT 1 FROM table2 t2 WHERE t2.first = t1.id AND type <> 'someType') OR
EXISTS (SELECT 1 FROM table2 t2 WHERE t2.second = t1.id AND type <> 'someType');
Каждое EXISTS
предложение проверяет возможное совпадение table1.id
значения со table2
столбцом.
Комментарии:
1. Это быстрее, чем просто использовать операторы OR между 2 IN?
2. @Muhammed Это зависит от того, как оптимизируется SQLite
WHERE IN
. Скорее всего, мой ответ не был бы медленнее , чем использованиеWHERE IN
.
Ответ №2:
Вам не нужен подзапрос, если вы хотите выбрать из t1
, только если условия совпадают. Попробуйте следующий запрос:
SELECT
t1.id,
t1.attr1,
t1.attr2
FROM table1 t1 , table2 t2
WHERE
(t1.id = t2.first OR t1.id = t2.second)
AND t2.type not in ('someType' , "...");
Ответ №3:
Вы можете сделать это с помощью ВНУТРЕННЕГО СОЕДИНЕНИЯ:
SELECT DISTINCT t1.id, t1.attr1, t1.attr2
FROM table1 t1 INNER JOIN table2 t2
ON t2.first = t1.id OR t2.second = t1.id
WHERE t2.type <> "..." AND t2.type <> "someType"
Предложение ON также может быть записано как:
ON t1.id IN (t2.first, t2.second)
Я использовал DISTINCT
на случай, table1.id
если table2
может совпадать несколько строк в,,.