sql – 选择查询以获取与列中所有值对应的行

考虑这个示例表“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来过滤行.

点赞