SQL Oracle错误内选择
这回单行查询子查询返回不止一行SQL Oracle错误内选择
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;
如果我在子查询添加顺序,它返回一个缺少右括号。
任何人都可以给我任何线索发生什么事情?
顺便说一句,我知道关键字/词被反转大/小写
你想要一个相关的子查询,而不是在子查询中使用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;
你内心的SELECT语句返回多行。尝试添加WHERE子句以限制您的选择返回一行。
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
不知道更多关于你的架构和数据,它看起来对我来说,问题是“组由ENCAN.NO_ENCAN”
我不认为你需要通过组,或者是导致你问题。
这个问题并不在于群组中。如果该分组只会返回一行,那就是有效的。像这样的子查询只能在选择列表中使用,如果它返回单个值并且该值对于返回的每一行都是相同的。 – 2015-03-02 19:44:00
Group by ENCAN.NO_ENCAN
导致此问题。由于您没有选择该列,因此您不需要按此进行分组。
这没有任何意义。他正在返回列的SUM(),但这与正确的分组无关。根据我对他的数据模型的猜测,他正在使用正确的列进行分组,只是错误的语法(请参阅我对正确的“PARTITION BY”语句的回答)。 – 2015-03-02 19:45:42
如果我正确理解你想要完成什么,我相信子查询是不必要的。你应该只对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。
我会做这样的:
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;
这肯定会限制子查询,但我不认为它会完成什么查询是有意做的。看起来报表应该能够动态地返回encan中所有行的总和。 – 2015-03-02 19:42:07