Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-00904-无效标识符_Sql_Oracle - Fatal编程技术网

Sql ORA-00904-无效标识符

Sql ORA-00904-无效标识符,sql,oracle,Sql,Oracle,我是PL/SQL新手,我正在尽可能快地学习它 我试图做一个简单的选择,但我遇到了这个错误 虽然我知道这意味着什么,但我真的不知道如何解决这个问题 这是我的代码部分: 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 ''


我是PL/SQL新手,我正在尽可能快地学习它
我试图做一个简单的选择,但我遇到了这个错误
虽然我知道这意味着什么,但我真的不知道如何解决这个问题

这是我的代码部分:

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是导致此错误的列。。。。。有人帮忙吗


编辑:我不是问为什么我不能在群组中使用别名。我要求解决这个问题…

要对您拥有的复杂函数进行分组,我总是进行子选择。因此,您的查询将变成:

  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;

要对您拥有的复杂函数进行分组,我总是进行子选择。因此,您的查询将变成:

  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;

从您已经展示的内容来看,您根本不需要GROUPBY子句,因为您没有聚合函数(min、max等)。select列表中的每一列都在GROUPBY子句中

如果您使用该子句来抑制重复项,那么使用
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
    )

(您可能还想看看
是否不存在
检查是否比您现在拥有的
不在
中更有效。)

从您所展示的内容来看,您根本不需要group by子句,因为您没有聚合函数(min、max等)。select列表中的每一列都在GROUPBY子句中

如果您使用该子句来抑制重复项,那么使用
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
    )

(您可能还想看看
是否不存在
检查是否比您现在拥有的
不在
中更有效。)

其他答案为您提供了两个选项,并且都是正确的。为了明确起见,并具体回答您编辑的问题,您有三个选项来解决无法引用
分组中的别名列的问题:

1) 这样可以方便地引用列别名,即

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

其他答案给你两个选择,都是正确的。为了明确起见,并具体回答您编辑的问题,您有三个选项来解决无法引用
分组中的别名列的问题:

1) 这样可以方便地引用列别名,即

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

可能重复的是正确的
'N'CL\u MED
还是类似于选择中的
'N'+''+CL\u MED
statemnt@piet.t我知道化名不能用在分组中。我只是在询问如何编辑查询以使其正常工作……使用链接问题答案中建议的子查询(内联视图)。或者,如果你已经知道原因的话,也许是一个更好的副本?等等,为什么你有一个GROUPBY子句?您没有使用任何聚合函数。你只是得到了重复的吗?如果是这样,请使用
distinct
。它可能是正确的
'N'CL\u MED
还是类似于选择中的
'N'+''+CL\u MED
statemnt@piet.t我知道化名不能用在分组中。我只是在询问如何编辑查询以使其正常工作……使用链接问题答案中建议的子查询(内联视图)。或者,如果你已经知道原因的话,也许是一个更好的副本?等等,为什么你有一个GROUPBY子句?您没有使用任何聚合函数。你只是得到了重复的吗?如果是这样,请使用
distinct
。但是它是按选择列表中的每一列进行分组的-那么为什么不直接使用
distinct
呢?不,问题是我已经删除了示例中所有不感兴趣的列,以便于阅读。您可以添加所需的每一列,选择也将按预期工作。不确定您的意思。这是问题中的所有列。添加到选择列表中的任何列也必须添加到组中,除非它们是聚合。在我给出的解决方案中,我删除了NVL(UPPER(T.COL1),'N.D.')COL1,V.SECO,'N'CL_-MED,V.DEST_-USO…列。。。。为了更好地理解,我似乎失败了。但是它是按选择列表中的每一列进行分组的-所以为什么不直接使用
distinct
?不,问题是我删除了所有对示例不感兴趣的列,以便于阅读。您可以添加所需的每一列,选择也将按预期工作。不确定您的意思。这是问题中的所有列。添加到选择列表中的任何列也必须添加到组中,除非它们是聚合。在我给出的解决方案中,我删除了NVL(UPPER(T.COL1),'N.D.')COL1,V.SECO,'N'CL_-MED,V.DEST_-USO…列。。。。为了更好的理解,但我似乎失败了。