SQL select 内部 select 上的 oracle 错误
SQL oracle error on select inside select
本return单行查询子查询return多行
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,它 return 缺少右括号。
谁能告诉我发生了什么事的线索?
顺便说一下,我知道 keyword/word 是倒过来的 uppercase/lowercase
您的内部 select 语句 return 不止一行。尝试添加 WHERE 子句以将 select 限制为 return 一行。
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
在不了解您的模式和数据的情况下,在我看来问题是 'group by ENCAN.NO_ENCAN'
我认为您不需要分组依据,否则它会导致您出现问题。
Group by ENCAN.NO_ENCAN
导致了这个问题。由于您没有选择该列,因此不需要按该列进行分组。
如果我正确理解了您要完成的任务,我相信子查询是不必要的。您应该只对 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, although I would really suggest reading more about Analytic Functions in Oracle.
您需要相关子查询而不是子查询中的 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;
我会这样做:
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;
本return单行查询子查询return多行
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,它 return 缺少右括号。
谁能告诉我发生了什么事的线索?
顺便说一下,我知道 keyword/word 是倒过来的 uppercase/lowercase
您的内部 select 语句 return 不止一行。尝试添加 WHERE 子句以将 select 限制为 return 一行。
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
在不了解您的模式和数据的情况下,在我看来问题是 'group by ENCAN.NO_ENCAN'
我认为您不需要分组依据,否则它会导致您出现问题。
Group by ENCAN.NO_ENCAN
导致了这个问题。由于您没有选择该列,因此不需要按该列进行分组。
如果我正确理解了您要完成的任务,我相信子查询是不必要的。您应该只对 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, although I would really suggest reading more about Analytic Functions in Oracle.
您需要相关子查询而不是子查询中的 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;
我会这样做:
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;