Как проверить один столбец запроса с несколькими столбцами подзапроса?

#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 может совпадать несколько строк в,,.