检索一列中满足其他列条件组合的所有不同值(SQL)

时间:2016-09-23 16:47:19

标签: sql

我有一张这样的表:

+-----------------+-----------------+
+        x        +        y        +
+-----------------+-----------------+
+        a        +        1        +
+        a        +        2        +
+        b        +        1        +
+        b        +        3        +
+        c        +        1        +
+        c        +        2        +
+        c        +        3        +
+-----------------+-----------------+

假设我想在x中找到所有不同的行,这些行包含y 每组中所需的值组合。

说条件是找到y = [1,2]所有的组。这会产生ac

请注意,解决方案需要扩展为y中的任意数量的组合,例如y = [1,2,3],这将产生c

4 个答案:

答案 0 :(得分:3)

我使用group byhaving来解决此问题。如果你想要1和2以及其他任何东西:

select x
from t
where y in (1, 2)
group by x
having count(distinct y) = 2;

如果您知道x / y对是唯一的,则distinct是不必要的。

如果您只想1,因为这是完全匹配:

select x
from t
group by x
having sum(case when y = 1 then 1 else 0 end) > 0 and
       sum(case when y = 2 then 1 else 0 end) > 0 and
       sum(case when y not in (1, 2) then 1 else 0 end) = 0;

答案 1 :(得分:1)

您可以尝试使用count(*)=数组中元素的数量

 select x from (
 select distinct x, y 
 from my_table where y in (1,2) ) t 
 group by x 
 having count(*) = 2

答案 2 :(得分:1)

此解决方案基于其他答案,但您只需按照提及的方式添加一次列表即可。

您无需更改where条件中的列表值以及count()函数中列表的长度。

declare @list varchar(10)
set @list = '1,2,3' --you add this list only

declare @listOfIDs varchar(10);
SET @listOfIDs = concat(',',@list,',');

select x
from p
where charindex(',' + CAST(p.y as nvarchar(20)) + ',', @listOfIDs) >0
group by x
having count(distinct y) = len(@list)-len(replace(@list,',',''))+1;

您可以使用不同的列表here

它适用于1,305,2

答案 3 :(得分:1)

尝试使用以下查询。

SELECT X
FROM #T
WHERE Y IN (1,2)
GROUP BY X
HAVING COUNT(Y)=(SELECT COUNT(DISTINCT Y) FROM #T WHERE Y IN (1,2))

您可以使用动态查询在变量中传递y列值。

DECLARE @input VARCHAR(50)='1,2'

DECLARE @sql NVARCHAR(MAX)=
    'SELECT X
    FROM #T
    WHERE Y IN ('+@input+')
    GROUP BY X
    HAVING COUNT(Y)=(SELECT COUNT(DISTINCT Y) FROM #T WHERE Y IN ('+@input+'))'
EXEC (@sql)

示例输出

enter image description here