2016-09-23 32 views
1

我有一个表,像这样:检索一列满足在其他列(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

+0

你使用的是什么RDBMS,SQL的servery? MySQL的? – EoinS

+0

@EoinS PostgreSQL,但它可以很好地解决问题的一般解决方案:) – salient

回答

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

可以尝试使用具有COUNT(*)=元件的数目在阵列

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

@salient可以有重复的值,即(a,1)和(a,1)吗?如果没有,这将工作。 – EoinS

+0

@EoinS - 是的,可以有这种情况。 – salient

+0

只需将count添加到不同的位置()即可完成此工作 – EoinS

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

+0

非常有趣的解决方案。你有什么想法,也可以将它与解决方案结合起来,在y中找到所有独特的**发生**组合。即1; 2; 3; [1,2]; [1,3]; [2,3]; [1,2,3]? – salient

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 ('[email protected]+') 
    GROUP BY X 
    HAVING COUNT(Y)=(SELECT COUNT(DISTINCT Y) FROM #T WHERE Y IN ('[email protected]+'))' 
EXEC (@sql) 

样本输出

enter image description here

相关问题