我有一张这样的表:
+-----------------+-----------------+
+ x + y +
+-----------------+-----------------+
+ a + 1 +
+ a + 2 +
+ b + 1 +
+ b + 3 +
+ c + 1 +
+ c + 2 +
+ c + 3 +
+-----------------+-----------------+
假设我想在x中找到所有不同的行,这些行包含y 每组中所需的值组合。
说条件是找到y = [1,2]
所有的组。这会产生a
和c
。
请注意,解决方案需要扩展为y中的任意数量的组合,例如y = [1,2,3]
,这将产生c
。
答案 0 :(得分:3)
我使用group by
和having
来解决此问题。如果你想要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)
示例输出