我使用的是Oracle 11g R2。
我想从具有多个子行的表中返回单个值。 子查询必须根据第二个不相关列的最大值返回值。
以下代码以CTE的形式提供数据...并且尝试创建语句失败。 我知道我必须以某种方式区分这些值,以便它返回具有最大子数的那个。
检查摘录"预期结果"。
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,AND SUB_B6。
答案 0 :(得分:1)
使用Analytic Function
。试试这个
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 'BBB', 'SUB_B5' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL
SELECT 'BBB', 'SUB_B6' FROM DUAL
),
TAB1 (GRP)
AS
(
SELECT 'AAA' FROM DUAL UNION ALL
SELECT 'BBB' FROM DUAL
)
(
select grp,subgrp from(
SELECT
TAB1.GRP,
GRPS.SUBGRP,
row_number() over(partition by TAB1.GRP order by count(1) desc) rn
FROM TAB1
JOIN GRPS
ON (GRPS.GRP = TAB1.GRP)
group by TAB1.GRP,
GRPS.SUBGRP
) a where rn=1
)
;