考虑这个示例表“Table1”.
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之间的所有值.
感谢任何建议.
最佳答案 您可以使用分析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来过滤行.