请允许我在前言中说我对sql相当陌生,并且我确信有一种简单的方法可以做到这一点我不理解。
让我们说我们有一张桌子:
X | Y
2 | 2
3 | 1
3 | 3
3 | 2
我试图找到y的值,使得x包含2和3。
基本上,y = 2是满足此目的的唯一值。
编辑:我知道在关系代数中这对于除法来说是微不足道的
答案 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