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;