Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择“查询”以获取与列中所有值对应的行_Sql_Oracle - Fatal编程技术网

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

Sql 选择“查询”以获取与列中所有值对应的行,sql,oracle,Sql,Oracle,考虑这个示例表“Table1” 我试图从Col1中获取这些值,它对应于所有值(在本例中为1,2,3,4,5)。在这里,查询的结果应该返回“A”,因为在Col2中没有任何其他值都是1,2,3,4,5 请注意,Col2中的值由查询中的其他参数决定,它们将始终返回一些数值。在这些值中,查询需要从Col1中获取与Col2中的all对应的值。例如,Col2中的值可以是11,12,1,2,3,4(表示不一定按顺序排列)。 我尝试了以下选择查询: select distinct Col1 from Tabl

考虑这个示例表“Table1”

我试图从Col1中获取这些值,它对应于所有值(在本例中为1,2,3,4,5)。在这里,查询的结果应该返回“A”,因为在Col2中没有任何其他值都是1,2,3,4,5

请注意,Col2中的值由查询中的其他参数决定,它们将始终返回一些数值。在这些值中,查询需要从Col1中获取与Col2中的all对应的值。例如,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应用“and”,而不是“or”

类似于从Col1返回一个值,其中Col2“包含”1和5之间的所有值


感谢您的建议。

您可以使用listag函数,如

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'

您可以使用解析行数()函数

获取设置和工作演示

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.

partitionby
子句将对每组col1进行分组,
orderby
将对每组col1中的col2进行排序。因此,子查询按顺序为每一行提供行号。现在您知道,您只需要行号至少为5的行。因此,在外部查询中,您所需要做的就是
其中rn=5
过滤行。

您也可以使用下面的

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

谢谢首先,我认为Col2列表将在“表1”之前,否则它会给出错误。还有一个问题,如果我有额外的“哪里”条件,它们会去哪里?我无法将它们添加到Col2List='1,2,3,4,5'之后,因为无法识别列,因为'from Table1'在括号内。为什么
LISTAGG
?OP没有查找字符串聚合。@LalitKumarB ListAgg用于按Col2分组的聚合值。稍后在where语句中使用聚合值。@hkutluay您缺少该点。实现这一目标有许多复杂的方法。但是,当您只需要一个窗口函数从每个组返回一组有序的行时,使用
listag
和分隔符等有什么意义呢
listag
对于字符串聚合非常有用。在OP的情况下,他期望的是单个值而不是分隔的列表。@LalitKumarB查询返回的是一组行,而不是分隔的字符串。ListAgg在筛选行上使用。应该有上千种其他选择来实现这一点,但这是我用来解决这个问题的方法。这是有效的。我会检查所有的情况。另外,你介意详细说明一下这个问题吗?我以前没有使用过OVER或PARTITION查询参数。@Hemang它是解析函数
PARTITION BY
子句将对每组col1进行分组,
ORDER BY
将对每组col1中的col2进行排序。因此,子查询按顺序为每一行提供行号。查看更新说明。好的,很好。知道了。是的,我只是用我的扩展查询(包括其他参数)检查它,所以如果有任何查询/错误,我可以在接受之前咨询您。Def现在将接受。谢谢你的解答和解释。
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