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…列。。。。为了更好的理解,但我似乎失败了。