选择里面选择SQL oracle错误

时间:2015-03-02 19:28:25

标签: sql oracle subquery

此返回单行查询子查询返回多行

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,它会返回一个缺少右括号。

任何人都可以向我提供有关正在发生的事情的线索吗?

顺便说一句,我知道关键字/单词是反转的大写/小写

6 个答案:

答案 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;