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

时间:2015-11-05 06:50:17

标签: sql oracle

考虑这个示例表"表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之间。

感谢任何建议。

3 个答案:

答案 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