选择包含每个数字但不仅包含一个

时间:2015-11-05 04:38:33

标签: sql oracle

请允许我在前言中说我对sql相当陌生,并且我确信有一种简单的方法可以做到这一点我不理解。

让我们说我们有一张桌子:

X | Y
2 | 2
3 | 1
3 | 3
3 | 2

我试图找到y的值,使得x包含2和3。

基本上,y = 2是满足此目的的唯一值。

编辑:我知道在关系代数中这对于除法来说是微不足道的

4 个答案:

答案 0 :(得分:3)

使用条件SUM。如果Y包含2总和的任何一组将大于0,则与3相同

 SELECT Y
 FROM YourTable
 GROUP BY Y
 HAVING SUM(CASE WHEN X = 2 THEN 1 ELSE 0 END) > 0
    and SUM(CASE WHEN X = 3 THEN 1 ELSE 0 END) > 0

答案 1 :(得分:2)

你可以试试这个:

select y
from test 
where x in (2,3) 
group by y 
having count(*) = 2;
编辑:请注意Juan的好建议。如果您的数据包含X = 2和Y = 2,则编写查询的更好方法是:

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

答案 2 :(得分:0)

我使用INTERSECT

SELECT Y
FROM YourTable
WHERE X = 2

INTERSECT

SELECT Y
FROM YourTable
WHERE X = 3

答案 3 :(得分:0)

使用分析 LAG()功能。

SELECT y
FROM
  ( SELECT x, 
           y, 
           lag(x) OVER(PARTITION BY y ORDER BY x) x_lag FROM your_table WHERE x IN (2, 3)
  )
WHERE x_lag = x - 1;

工作演示:

SQL> WITH DATA AS(
  2  SELECT 2 X, 2 Y FROM dual UNION ALL
  3  SELECT 3 X, 1 Y FROM dual UNION ALL
  4  SELECT 3 X, 3 Y FROM dual UNION ALL
  5  SELECT 3 X, 2 Y FROM dual
  6  )
  7  SELECT y
  8  FROM
  9    ( SELECT x,
 10     y,
 11     lag(x) OVER(PARTITION BY y ORDER BY x) x_lag FROM data WHERE x IN (2, 3)
 12    )
 13  WHERE x_lag = x - 1;

         Y
----------
         2