此返回单行查询子查询返回多行
select E.NO_ENCAN, E.NOM_ENC, TE.DESC_TYPE_ENC as TYPE_ENC,
(select sum(ITEM.MNT_VALEUR_ITE) from ENCAN left join ITEM on ITEM.NO_ENCAN = ENCAN.NO_ENCAN group by ENCAN.NO_ENCAN) as SOMME_ITEMS,
count(distinct INV.NOM_UTILISATEUR_INVITE) as NOMBRE_INVITES
from ENCAN E
left join TYPE_ENCAN TE on TE.CODE_TYPE_ENC = E.CODE_TYPE_ENC
left join INVITE INV on INV.NO_ENCAN = E.NO_ENCAN
group by E.NO_ENCAN, E.NOM_ENC, TE.DESC_TYPE_ENC
order by E.NO_ENCAN;
如果我在子查询中添加order by,它会返回一个缺少右括号。
任何人都可以向我提供有关正在发生的事情的线索吗?
顺便说一句,我知道关键字/单词是反转的大写/小写
答案 0 :(得分:2)
您希望子选择中的相关子查询而不是group by
。这也意味着不需要子查询。所以,这可能是你想写的:
select E.NO_ENCAN, E.NOM_ENC, TE.DESC_TYPE_ENC as TYPE_ENC,
(select sum(ITEM.MNT_VALEUR_ITE)
from ITEM
where ITEM.NO_ENCAN = ENCAN.NO_ENCAN
) as SOMME_ITEMS,
count(distinct INV.NOM_UTILISATEUR_INVITE) as NOMBRE_INVITES
from ENCAN E left join
TYPE_ENCAN TE
on TE.CODE_TYPE_ENC = E.CODE_TYPE_ENC left join
INVITE INV
on INV.NO_ENCAN = E.NO_ENCAN
group by E.NO_ENCAN, E.NOM_ENC, TE.DESC_TYPE_ENC
order by E.NO_ENCAN;
答案 1 :(得分:1)
在不了解您的架构和数据的情况下,我认为问题是ENCAN.NO_ENCAN''
我认为你不需要这个小组,或者它会导致你的问题。
答案 2 :(得分:1)
如果我正确理解你要完成的任务,我相信子查询是不必要的。您应该对SUM()调用进行分析。
SELECT e.no_encan
,e.nom_enc
,te.desc_type_enc AS type_enc
,SUM(item.mnt_valeur_ite) OVER (PARTITION BY e.no_encan) somme_items
,COUNT(DISTINCT inv.nom_utilisateur_invite) AS nombre_invites
FROM encan e
LEFT JOIN type_encan te ON te.code_type_enc = e.code_type_enc
LEFT JOIN invite INV ON inv.no_encan = e.no_encan
GROUP BY e.no_encan, e.nom_enc, te.desc_type_enc
ORDER BY e.no_encan;
可以找到详细信息here,但我真的建议您详细了解Analytic Functions in Oracle。
答案 3 :(得分:0)
您的内部select语句返回多行。尝试添加WHERE子句以限制select返回一行。
select sum(ITEM.MNT_VALEUR_ITE) from ENCAN left join ITEM on ITEM.NO_ENCAN = ENCAN.NO_ENCAN
**WHERE ENCAN.NO_ENCAN = '1234'**
group by ENCAN.NO_ENCAN
答案 4 :(得分:0)
Group by ENCAN.NO_ENCAN
导致问题。由于您没有选择该列,因此无需按此分组。
答案 5 :(得分:0)
我会这样做:
with INVITE_ROLLUP as
(
select ENCAN.NO_ENCAN, sum(ITEM.MNT_VALEUR_ITE) as NOMBRE_INVITES
from ENCAN
left join ITEM on ITEM.NO_ENCAN = ENCAN.NO_ENCAN
group by ENCAN.NO_ENCAN
)
select
E.NO_ENCAN,
E.NOM_ENC,
TE.DESC_TYPE_ENC as TYPE_ENC,
INVITE_ROLLUP.NOMBRE_INVITES AS NOMBRE_INVITES
from ENCAN E
left join TYPE_ENCAN TE on TE.CODE_TYPE_ENC = E.CODE_TYPE_ENC
left join INVITE INV on INV.NO_ENCAN = E.NO_ENCAN
left join INVITE_ROLLUP ON E.NO_ENCAN = INVITE_ROLLUP.NO_ENCAN
group by E.NO_ENCAN, E.NOM_ENC, TE.DESC_TYPE_ENC
order by E.NO_ENCAN;