考虑这个示例表"表1和#34;。
Col1 Col2
A 1
B 1
A 4
A 5
A 3
A 2
D 1
B 2
C 3
B 4
我试图从Col1中获取与所有值相对应的值(在本例中为1,2,3,4,5)。这里查询的结果应该返回' A'因为其他人都没有在Col2中获得所有值1,2,3,4,5。
请注意,Col2中的值由查询中的其他参数决定,它们将始终返回一些数值。在这些值中,查询需要从Col1中获取与Col1相对应的值。例如,Col2中的值可以是11,12,1,2,3,4(意味着不一定按顺序)。
我尝试了以下选择查询:
select distinct Col1 from Table1 where Col1 in (1,2,3,4,5);
select distinct Col1 from Table1 where Col1 exists (select distinct Col2 from Table1);
及其不同的变化。但问题是我需要应用'和'对于Col2而言,不是'或'。
例如从Col1返回一个值,其中Col2'包含'所有值都在1到5之间。
感谢任何建议。
答案 0 :(得分:1)
您可以使用listagg函数,例如
SELECT Col1
FROM
(select Col1,listagg(Col2,',') within group (order by Col2) Col2List from Table1
group by Col1)
WHERE Col2List = '1,2,3,4,5'
答案 1 :(得分:1)
您可以使用分析 ROW_NUMBER()功能。
SQL FIddle 进行设置和工作演示。
SELECT col1
FROM
(SELECT col1,
col2,
row_number() OVER(PARTITION BY col1 ORDER BY col2) rn
FROM your_table
WHERE col2 IN (1,2,3,4,5)
)
WHERE rn =5;
更新根据OP的要求,提供有关查询如何工作的一些说明。
内部子查询为您提供以下结果集:
SQL> SELECT col1,
2 col2,
3 row_number() OVER(PARTITION BY col1 ORDER BY col2) rn
4 FROM t
5 WHERE col2 IN (1,2,3,4,5);
C COL2 RN
- ---------- ----------
A 1 1
A 2 2
A 3 3
A 4 4
A 5 5
B 1 1
B 2 2
B 4 3
C 3 1
D 1 1
10 rows selected.
PARTITION BY
子句将对每组col1进行分组,ORDER BY
将对每组col1中的col2进行排序。因此,子查询以有序的方式为每行提供row_number。现在你知道你只需要row_number 至少为5 的那些行。因此,在外部查询中,您需要做的只是WHERE rn =5
来过滤行。
答案 2 :(得分:0)
您也可以使用以下
SELECT COL1
FROM TABLE_NAME
GROUP BY COL1
HAVING
COUNT(COL1)=5
AND
SUM(
(CASE WHEN COL2=1 THEN 1 ELSE 0
END)
+
(CASE WHEN COL2=2 THEN 1 ELSE 0
END)
+
(CASE WHEN COL2=3 THEN 1 ELSE 0
END)
+
(CASE WHEN COL2=4 THEN 1 ELSE 0
END)
+
(CASE WHEN COL2=5 THEN 1 ELSE 0
END))=5