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:是的,你是对的。萨尔曼的回答将其视为一个和条件。我不认为有更简单的方式来表达这种逻辑。我不认为有更简单的方式来表达这种逻辑。