【问题标题】:Multiple values IN多个值 IN
【发布时间】:2011-09-27 15:27:13
【问题描述】:
通常 IN 与一个值一起使用:
SELECT * FROM data WHERE f1 IN (<subquery>)
它可以与多个值一起使用:
SELECT * FROM data WHERE f1 IN (<subquery>) OR f2 IN (<subquery>);
但是我可以删除重复项吗,例如:
SELECT * FROM data WHERE ANY(f1, f1) IN (<subquery>)
我尝试使用 CTE,但它也需要子查询。
【问题讨论】:
标签:
sql
postgresql
in-subquery
【解决方案1】:
假设您有 col1、col2 和 col3 列,并且您在子查询中查找 col1 和 col2(为了便于说明),您可以执行以下操作:
select col1,col2,col3
from table
where (col1,col2) in (<subquery>)
group by 1,2,3;
只要<subquery> 是select col1,col2 from <blah> 的(粗略)形式,那么您最终将得到不同的(col1,col2,col3) 三元组,其中(col1,col2) 对出现在<subquery> 中。
【解决方案2】:
我可以用集合运算符来写这个:
SELECT *
FROM data
WHERE EXISTS (
VALUES(f1, f2)
INTERSECT
SELECT(<subquery>)
)
【解决方案3】:
虽然这两种解决方案都有效,但我发现最快(不幸的是不是最短)的方法是使用 CTE:
WITH x AS (<subquery>)
SELECT * FROM data WHERE f1 IN (SELECT * FROM x) OR f2 (SELECT * FROM x)