2015-03-02 78 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;