2015-03-02 99 views
0

这回单行查询子查询返回不止一行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; 

如果我在子查询添加顺序,它返回一个缺少右括号。

任何人都可以给我任何线索发生什么事情?

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

回答

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; 
0

你内心的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 
+0

这肯定会限制子查询,但我不认为它会完成什么查询是有意做的。看起来报表应该能够动态地返回encan中所有行的总和。 – 2015-03-02 19:42:07

1

不知道更多关于你的架构和数据,它看起来对我来说,问题是“组由ENCAN.NO_ENCAN”

我不认为你需要通过组,或者是导致你问题。

+0

这个问题并不在于群组中。如果该分组只会返回一行,那就是有效的。像这样的子查询只能在选择列表中使用,如果它返回单个值并且该值对于返回的每一行都是相同的。 – 2015-03-02 19:44:00

0

Group by ENCAN.NO_ENCAN导致此问题。由于您没有选择该列,因此您不需要按此进行分组。

+0

这没有任何意义。他正在返回列的SUM(),但这与正确的分组无关。根据我对他的数据模型的猜测,他正在使用正确的列进行分组,只是错误的语法(请参阅我对正确的“PARTITION BY”语句的回答)。 – 2015-03-02 19:45:42

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

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;