SQL选择一对多要素关系,以选择具有特定要素的关键点

SQL选择一对多要素关系,以选择具有特定要素的关键点,sql,postgresql,select,Sql,Postgresql,Select,假设我有一个包含以下数据的表: foreign-key | feature 1 | a 1 | b 2 | a 2 | b 2 | c 3 | a 3 | c 我想要一条语句,它返回一个唯一的键列表,这些键同时分配了功能a和功能b,因此结果行应该是“1,2” 假设我想向查询中添加额外的约束,如果整个内容不嵌套到多个层中就好了。这可以通过groupby和ha

假设我有一个包含以下数据的表:

foreign-key | feature
          1 | a
          1 | b
          2 | a
          2 | b
          2 | c
          3 | a
          3 | c
我想要一条语句,它返回一个唯一的键列表,这些键同时分配了功能a和功能b,因此结果行应该是“1,2”


假设我想向查询中添加额外的约束,如果整个内容不嵌套到多个层中就好了。

这可以通过
groupby
have
实现

select foreign-key
from tbl 
where feature in ('a','b')
group by foreign-key
having count(distinct feature)=2

这可以通过
分组方式
拥有
来完成

select foreign-key
from tbl 
where feature in ('a','b')
group by foreign-key
having count(distinct feature)=2

您还可以将
分组依据
MIN/MAX()一起使用

选择外键
来自表t
其中特征位于('a','b')
按外键分组
具有最小(特征)和最大(特征);

您也可以将
分组依据
MIN/MAX()一起使用

选择外键
来自表t
其中特征位于('a','b')
按外键分组
具有最小(特征)和最大(特征);

只是提供了一种更方便的方法

它在计数不同时使用大小写

但也许你会想:这样一种反对代码高尔夫的罪恶有什么好处吗

好的,它使得用一个类似于标准的
交换所有这些
=
标准变得简单。
ILIKE
标准(不区分大小写)


只是提供了一个更方便的方法

它在计数不同时使用大小写

但也许你会想:这样一种反对代码高尔夫的罪恶有什么好处吗

好的,它使得用一个类似于
标准的
交换所有这些
=
标准变得简单。
ILIKE
标准(不区分大小写)


你用的是哪种数据库管理系统?我用的是postgresql。你用的是哪种数据库管理系统?我用的是postgresql。行“where feature in('a','b')是否也包含“like”语句?是的..并且
having count…
必须相应地修改。根据我要找的功能的数量?我在考虑
where lower(feature)in(如“%a%”,如“%b%”)
@salbeira如果SQL允许在IN中使用like的语法,那就太好了。但是看看我的答案。行“where FEATION IN('a',b')是否也包含“like”语句?是的。
具有count…必须进行相应的修改。根据我正在寻找的功能的数量?我正在考虑
中较低(功能)的位置(如“%a%”,如“%b%”)
@salbeira如果SQL允许在in中使用like的语法,那就太好了。但是看看我的答案。
SELECT foreign-key
FROM tbl 
WHERE (feature = 'a' OR feature = 'b')
GROUP BY foreign-key
HAVING COUNT(DISTINCT
             CASE 
             WHEN feature = 'a' THEN 1 
             WHEN feature = 'b' THEN 2 
             END) = 2