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

标签 sql oracle

考虑这个示例表“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/

相关文章:

sql - 多个 SQL 计入多个条件

database - Oracle 数据库多实例配置

PHP MySQL 转储命令

php - MySQL - 计算左连接没有性能

java - 在 Windows 中验证 tnsnames.ora 语法

sql - 用序列插入两个oracle表

oracle - 如何清除 Oracle 中的高级队列

java - 如何将 Map 传递给 Oracle PL/SQL 函数?

php - 创建论坛,并尝试按时间戳对两个表进行排序。一张表主题和其他回复。我该如何对这些进行排序?

SQL - 删除重复项以显示最新日期记录