【发布时间】:2015-01-17 15:07:45
【问题描述】:
我正在使用 Oracle 11g R2。
我想从具有多个子行的表中返回单个值。 子查询必须根据第二个不相关列的最大值数返回值。
以下代码以 CTE 的形式提供数据...以及创建语句的失败尝试。 我知道我必须以某种方式区分这些值,以便它返回具有最大子节点数的值。
检查sn-p“预期结果”。
WITH GRPS(GRP, SUBGRP)
AS
(
SELECT 'AAA', 'SUB_A1' FROM DUAL UNION ALL
SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
SELECT 'AAA', 'SUB_A3' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B5' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B7' FROM DUAL
),
TAB1 (GRP)
AS
(
SELECT 'AAA' FROM DUAL UNION ALL
SELECT 'BBB' FROM DUAL
)
(
SELECT
TAB1.GRP,
GRPS.SUBGRP,
COUNT(*)
FROM TAB1
JOIN GRPS
ON (GRPS.GRP = TAB1.GRP)
GROUP BY TAB1.GRP,
GRPS.SUBGRP
-- That will get me these:
-- Row# GRP SUBGRP COUNT(*)
-- 1 BBB SUB_B5 1
-- 2 AAA SUB_A2 3
-- 3 AAA SUB_A1 1
-- 4 BBB SUB_B6 2
-- From which I still have to perform a search to get me the rows with SUB_B6 AND SUB_A2
-- Expected result
-- AAA SUB_A2
-- BBB SUB_B6
)
;
当然,这不会起作用,并且会出现“单行子查询返回多行”之类的错误。 我不需要从相关子查询中获取任何行。我需要从该表中获取更多重复的值。在这种情况下,SUB_A2 和 SUB_B6。
【问题讨论】:
-
错误告诉你问题出在哪里。对于
AAA和BBB,GPRSCTE 中有不止一行。在correlated subquery中使用Top 1或修复其中的where子句 -
请注意“预期结果”部分和我的解释,我需要根据 SUBGRP 列的最大出现次数从子查询中获取数据。
-
非常感谢,但这不是我想要的.....我不是根据它们的降序来寻找 SUB_A2 和 SUB_B6 值......但因为它们是重复次数最多的值。我的意思是,我会先计算它们,然后检查哪个具有更多的计数值。