考虑这个示例表“Table1”。
Col1 Col2
A 1
B 1
A 4
A 5
A 3
A 2
D 1
B 2
C 3
B 4
我试图从对应于所有值(在本例中为 1、2、3、4、5)的 Col1 中获取这些值。此处查询的结果应返回“A”,因为其他任何一个都不在 Col2 中具有所有值 1,2,3,4,5。
请注意,Col2 中的值由查询中的其他参数决定,它们将始终返回一些数值。在这些值中,查询需要从 Col1 中获取对应于 Col2 中的所有值的值。例如,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
过滤行。
关于sql - 选择查询以获取与列中所有值对应的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33538267/