2015-03-02 3 views
0

Это возвращение однорядные подзапрос запрос возвращает более одной строкиSQL ошибка оракула на выбор внутри выберите

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

Ваш внутренний оператор выбора возвращает более одной строки. Попробуйте добавить предложение 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 сразу. –

1

Не зная больше о вашей схеме и данных, он смотрит на меня, как вопрос является «группа по ENCAN.NO_ENCAN»

Я не думаю, что вам нужна группа по, или это вызывая проблемы.

+0

Проблема не в группе. Если эта группировка вернет только одну строку, это будет действительным. Подзапрос, такой как этот, может использоваться только в списке выбора, если он возвращает одно значение, и это значение должно быть одинаковым для каждой возвращаемой строки. –

0

Group by ENCAN.NO_ENCAN вызывает проблему. Поскольку вы не выбираете этот столбец, вам не нужно группироваться.

+0

Это не имеет смысла. Он возвращает SUM() столбца, но это не имеет никакого отношения к правильной группировке. Основываясь на моей догадке в своей модели данных, он использует правильный столбец для группировки, просто неправильный синтаксис (см. Мой ответ для правильного оператора PARTITION BY). –

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; 
Смежные вопросы