2014-02-10 29 views
0
TABLE X 
col1,col2 
    1 , 2 
    1 , 7 
    1 , 4 
    1 , 8 
    2 , 3 
    2 , 1 
    2 , 2 
    3 , 1 
    3 , 8 
    3 , 9 
    3 , 4 
    4 , 5 
    4 , 3 
    4 , 2 
    4 , 8 
    4 , 4 

我想检索包含在COL2的COL1值在这种情况下,值2和4 它将检索值1和4 我怎样才能做到这一点不使用UNION所有运营商?查询,而不联盟操作SQL

,我使用的查询是

select distinct col1 
     from X as A 
     where col1 = (
      select col1 from (
      select distinct col1 
      from X as B 
      where A.col1 = B.col1 and col2 = 2 
      union ALL 
      select distinct col1 
      from X as C 
      where A.col1 = C.col1 and col2 = 4 
     ) D 
     group by col1 
     having count(col1) > 1 
     ) 

它返回正确的结果,但我的猜测是性能昂贵。 任何人都可以给我关于如何实现相同的结果,但没有工会的想法?

回答

1

我觉得跟自己加盟台的最佳性能将来自内部:

SELECT DISTINCT X1.col1 
FROM X X1 INNER JOIN X X2 ON X1.col1=X2.col1 
WHERE X1.col2=2 AND X2.col2=4 
2

这个问题被称为Relational Division,这里是这样做的一个办法:

SELECT col1 
FROM tablex 
WHERE col2 IN (2, 4) 
GROUP BY col1 
HAVING COUNT(DISTINCT col2) >=2 

HAVING COUNT(col2) >=2将确保所选择的col1必须同时拥有两个至少值2和4。

+0

事实上,你连接的演示是正确的 - 但查询有来自不同你在答案中发布的一个。区别在于'COUNT'中的'DISTINCT'。 – PaF

+0

@PaF - 对于你没有使用'DISTINCT'解释的情况,查询也可以正常工作,请参见[it here](http://sqlfiddle.com/#!2/1aeeb/2) –

+0

重复的条目恰好就是我的情况谈论:) – PaF