Sql 条件中的左侧有多个列

Sql 条件中的左侧有多个列,sql,postgresql,sql-in,Sql,Postgresql,Sql In,这是一个有效的声明: SELECT foo FROM table1 WHERE column1 IN (SELECT bar FROM table2) AND column2 IN (SELECT bar FROM table2) 但是,有没有办法避免重复表2中的选择栏语句,使其更简单、更经济 我的意思是这样的: SELECT foo FROM table1 WHERE «column1 and also column2» IN (SELECT bar FROM table2)

这是一个有效的声明:

SELECT foo FROM table1 WHERE
  column1 IN (SELECT bar FROM table2) AND
  column2 IN (SELECT bar FROM table2)
但是,有没有办法避免重复表2中的
选择栏
语句,使其更简单、更经济

我的意思是这样的:

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

可以使用带有EXISTS运算符的关联子查询

select *
from table1 t1
where exists (select *
              from table2 t2
              where t2.bar in (t1.column1, t1.column2));
如果两列都应与
表2.bar中的值匹配,则可以使用以下内容:

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

可以使用带有EXISTS运算符的关联子查询

select *
from table1 t1
where exists (select *
              from table2 t2
              where t2.bar in (t1.column1, t1.column2));
如果两列都应与
表2.bar中的值匹配,则可以使用以下内容:

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

您可以使用聚合:

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
);

因此,如果表1包含一对
(foo,bar)
,而表2包含值
(foo),(baz)
,则将不匹配。

可以使用聚合:

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
);

因此,如果表1包含一对
(foo,bar)
,而表2包含值
(foo),(baz)
,则它将不匹配。

这是不同的。如果原始查询有
,但它有
,则情况相同。我理解答案,但不是说它被接受了。@GordonLinoff:是的,你是对的。萨尔曼的回答将其视为一种状态,这是不同的。如果原始查询有
,但它有
,则情况相同。我理解答案,但不是说它被接受了。@GordonLinoff:是的,你是对的。萨尔曼的回答将其视为一个和条件。我不认为有更简单的方式来表达这种逻辑。我不认为有更简单的方式来表达这种逻辑。