2016-03-23 4 views
0


Я новичок в PL/SQL, и я стараюсь научиться этому как можно быстрее.
Я пытался сделать простой SELECT, но я наткнулся на эту ошибку.
Хотя я знаю, что это значит, я действительно не знаю, как решить эту проблему ...

Это моя часть кода:
ORA-00904 - Неверный идентификатор

SELECT 
    NVL(UPPER(T.COL1),'N.D.') COL1, 
    V.SECO, 
    'N' CL_MED, 
    V.DEST_USO, 
    (CASE 
    WHEN V.COL2 IS NULL 
     AND V.SECO IN ('B090','B100') THEN '' 
    WHEN V.COL2 LIKE 'L-DEF%' 
     OR V.COL2 LIKE 'L-FUI%' 
     AND V.SECO IN ('B090','B100') THEN 'FUI/DEF' 
    WHEN V.COL2 IS NULL 
     AND V.SECO = 'B080' 
     AND V.COL3 LIKE 'DEF%' 
     OR V.COL3 LIKE 'FUI%' THEN 'FUI/DEF' 
    ELSE '' 
    END 
    ) FLAG_DEF_FUI 
    FROM TAB1 V 
    JOIN TAB2 C ON (V.COL4 = C.COL4 
       AND V.COL5  = C.COL5 
       AND V.COL6 = C.COL6) 
    JOIN TAB3 T ON (V.COL4 = T.COL4 
        AND V.COL5 = T.COL5 
        AND V.COL5A = T.COL5A 
        AND T.COL6 =V.COL6) 
    WHERE V.COL4 = :COL4 
    AND V.COL6 = :COL6 
    AND V.COL5 NOT IN 
    (SELECT gcm.PDR 
    FROM TAB4 gcm 
    WHERE gcm.COL6 = :COL6 
    ) 
    GROUP BY (UPPER(T.COL1),V.SECO, V.DEST_USO, FLAG_DEF_FUI)  

и FLAG_DEF_FUI это столбец, который вызывает эту ошибку ..... Любая помощь?!

EDIT: Я не спрашиваю, ПОЧЕМУ Я не могу использовать псевдоним в GROUP BY. Я прошу обходной путь для этой проблемы ...

+0

Возможный дубликат [Почему не Oracle SQL позволяет использовать псевдонимы столбцов в GROUP BY статей?] (HTTP : //stackoverflow.com/questions/2681494/why-doesnt-oracle-sql-allow-us-to-use-column-aliases-in-group-by-clauses) –

+0

это правильно '' N 'CL_MED' или это что-то вроде этого '' N '+' '+ CL_MED' в select statemnt –

+0

@ piet.t Я знаю, что псевдонимы нельзя использовать в группе. Я просто спрашивал о том, как отредактировать запрос, чтобы он работал ... –

ответ

2

Чтобы сделать группу сложной функции той, что у вас есть, я всегда делаю подзаголовок. Таким образом, ваш запрос будет:

select child_query.stuff, child_query.flag_def_fui 
    from 
    ( 
    select 
     'some-stuff' some_stuff, 
     (case 
     when v.col2 is null 
      and v.seco in ('b090','b100') then '' 
     when v.col2 like 'l-def%' 
      or v.col2 like 'l-fui%' 
      and v.seco in ('b090','b100') then 'fui/def' 
     when v.col2 is null 
      and v.seco = 'b080' 
      and v.col3 like 'def%' 
      or v.col3 like 'fui%' then 'fui/def' 
     else '' 
     end 
     ) flag_def_fui 
     from tab1 v 
     join tab2 c 
     on (v.col4 = c.col4 
     and v.col5  = c.col5 
     and v.col6 = c.col6) 
     join tab3 t 
     on (v.col4   = t.col4 
     and v.col5    = t.col5 
     and v.col5a    = t.col5a 
     and t.col6   =v.col6) 
     where v.col4   = :col4 
     and v.col6   = :col6 
     and v.col5 not   in 
     (select gcm.pdr 
     from tab4 gcm 
     where gcm.col6 = :col6 
     ) 
    ) child_query 
     group by child_query.stuff, child_query.flag_def_fui; 
+1

Но он группируется по каждому столбцу в списке выбора - так почему бы просто не использовать 'distinct' вместо этого? –

+0

Нет, дело в том, что я удалил все столбцы, которые не интересны для примера, чтобы было легче читать. Вы можете добавить каждый столбец, который хотите, и выбор будет работать так же, как ожидалось. –

+0

Не уверен, что вы имеете в виду. У этого есть все столбцы из вопроса. Любые столбцы, которые вы добавляете в список выбора, также должны быть добавлены в группу, если они не являются агрегатами. Без каких-либо агрегатов, почему группа, когда вы можете использовать разные? –

1

От того, что вы показали вам не нужен группа, пункт а вообще, так как у вас нет агрегатных функций (мин, макс, и т.д.). Каждый столбец в списке выбора находится в предложении group-by.

Если вы используете эту статью для подавления дубликатов, то было бы проще использовать distinct ключевое слово вместо:

SELECT DISTINCT 
    NVL(UPPER(T.COL1),'N.D.') COL1, 
    V.SECO, 
    'N' CL_MED, 
    V.DEST_USO, 
    (CASE 
    WHEN V.COL2 IS NULL 
     AND V.SECO IN ('B090','B100') THEN '' 
    WHEN V.COL2 LIKE 'L-DEF%' 
     OR V.COL2 LIKE 'L-FUI%' 
     AND V.SECO IN ('B090','B100') THEN 'FUI/DEF' 
    WHEN V.COL2 IS NULL 
     AND V.SECO = 'B080' 
     AND V.COL3 LIKE 'DEF%' 
     OR V.COL3 LIKE 'FUI%' THEN 'FUI/DEF' 
    ELSE '' 
    END 
    ) FLAG_DEF_FUI 
    FROM TAB1 V 
    JOIN TAB2 C 
    ON (V.COL4 = C.COL4 
    AND V.COL5  = C.COL5 
    AND V.COL6 = C.COL6) 
    JOIN TAB3 T 
    ON (V.COL4   = T.COL4 
    AND V.COL5    = T.COL5 
    AND V.COL5A    = T.COL5A 
    AND T.COL6   =V.COL6) 
    WHERE V.COL4   = :COL4 
    AND V.COL6   = :COL6 
    AND V.COL5 NOT   IN 
    (SELECT gcm.PDR 
    FROM TAB4 gcm 
    WHERE gcm.COL6 = :COL6 
    ) 

(Вы также можете увидеть, если not exists проверка будет более эффективной, что not in у вас есть.)

2

Другие ответы дают вам два варианта и оба правильны. Просто чтобы быть ясно и конкретно ответить на ваш отредактированный вопрос, у вас есть три варианта для работы вокруг вопроса не в состоянии ссылаться на псевдонимы столбцов в GROUP BY:

1) Answer 1: Wrap your query так что псевдонимы столбцов могут быть легко ссылки, т.е.

SELECT column_alias 
    FROM (<your query>) 
GROUP BY column_alias; 

2) Answer 2: Don't use GROUP BY, если вы не используете агрегатные функции, используйте DISTINCT вместо этого.

3) Скопировать сложное выражение, что составляет колонку в GROUP BY, т.е.

SELECT CASE 
      WHEN col1 = 1 THEN 'one' 
      WHEN col1 = 2 THEN 'two' 
      ELSE '' 
     END as col1_alias, 
     SUM(col2) as col2_alias, 
     col3 
    FROM table_name 
GROUP BY CASE 
      WHEN col1 = 1 THEN 'one' 
      WHEN col1 = 2 THEN 'two' 
      ELSE '' 
     END, 
     col3; 
Смежные вопросы