Sql 选择“查询”以获取与列中所有值对应的行
考虑这个示例表“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(表示不一定按顺序排列)。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
我尝试了以下选择查询:
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