Несколько столбцов в левой части условия IN - PullRequest
0 голосов
/ 20 февраля 2019

Это правильное утверждение:

SELECT foo FROM table1 WHERE
  column1 IN (SELECT bar FROM table2) AND
  column2 IN (SELECT bar FROM table2)

Но есть ли способ избежать повторения оператора SELECT bar FROM table2, чтобы сделать его более простым и экономичным?

Я имею в виду что-то вродеэто:

SELECT foo FROM table1 WHERE
  «column1 and also column2» IN (SELECT bar FROM table2)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете использовать агрегацию:

select *
from table1
where exists (
    select 1
    from table2
    where table2.bar in (table1.column1, table1.column2)
    having count(distinct bar) = case when table1.column1 = table1.column2 then 1 else 2 end
);

Так что, если table1 содержит пару (foo, bar), а table2 содержит значения (foo), (baz), это не будет совпадать.

0 голосов
/ 20 февраля 2019

Вы можете использовать связанный подзапрос с оператором EXISTS

select *
from table1 t1
where exists (select *
              from table2 t2
              where t2.bar in (t1.column1, t1.column2));

Если оба столбца должны соответствовать значению в table2.bar, можно использовать следующее:

select *
from table1 t1
where exists (select *
              from table2 t2
              where t2.bar = t1.column1
                and t2.bar = t1.column2);
...