Sql Oracle 11g Concat函数错误

Sql Oracle 11g Concat函数错误,sql,oracle,Sql,Oracle,我遇到了以下错误: ORA-00904:“姓氏”:无效标识符 尝试使用concat函数生成报告时。 以下是查询: SELECT 'Full Name','User Name', 'Email' FROM Dual UNION ALL SELECT distinct concat(concat(firstname, ' '), lastname), username, Email FROM ( select distinct concat(concat(firstname, ' '), lastn

我遇到了以下错误:

ORA-00904:“姓氏”:无效标识符

尝试使用concat函数生成报告时。 以下是查询:

SELECT 'Full Name','User Name', 'Email' FROM Dual
UNION ALL
SELECT distinct concat(concat(firstname, ' '), lastname), username, Email
FROM
(
select distinct concat(concat(firstname, ' '), lastname), username, Email
from sas_aclentry, sas_usergroup 
where sas_aclentry.userkey = sas_usergroup.userkey
    and objecttype in (16,3,4,101,14,102) and productkey = 1 and type = 1 and privilege !=0 and isdeleted = 0 and STATUS IN (0, 32)
UNION
select distinct concat(concat(firstname, ' '), lastname), username, Email
from sas_objecttree 
    join sas_usergroup on sas_usergroup.userkey = sas_objecttree.childkey
where isdeleted = 0 and STATUS IN (0, 32)
     and parentkey in (
        select distinct sas_aclentry.userkey 
        from sas_aclentry
        join sas_usergroup on sas_usergroup.userkey = sas_aclentry.userkey
        where objecttype in (16,3,4,101,14,102) and productkey = 1 and type = 2 and privilege !=0 and isdeleted = 0)
)
WHERE UPPER(Email) LIKE '%SAS%';
在谷歌上漫游,但找不到任何方法来实现这一点。 请帮忙。 感谢您的任何意见


Will

错误似乎是外部查询试图从派生表中选择lastname,而派生表不公开任何具有该名称的列。我猜您是想在派生表中别名concated列并选择它

尝试将查询的开头更改为:

SELECT 'Full Name','User Name', 'Email' FROM Dual
UNION ALL
SELECT fullname, username, Email
FROM
(
select distinct firstname || ' ' || lastname as fullname, username, Email
对于某些数据库,concat可以接受两个以上的参数,但我不确定这对Oracle是否正确,但您应该能够使用连接运算符
|
,并将嵌套的concat函数更改为:

firstname || ' ' || lastname as fullname

这使得代码更简洁。(在使用显式联接时,我也会尽量保持一致——在派生表中,第一个查询使用隐式联接,第二个查询使用显式联接)。

除了已经指出的错误外,此查询中还有许多错误(您从投影不包含该名称的列的子查询中选择“lastname”)

执行联合时,联合的第一个术语必须具有列名或别名,这些列名或别名将用于联合的所有术语。仅从dual中选择三个字符串(可能用作标题)是不够的,还必须为每个字符串指定一个别名。例如,
选择“全名”作为全名。。。从双
。或者,您可以离开
选择框。。。从双
开始,以便以后在联合体中使用

“列标题”显示在查询顶部的事实并不意味着它们将位于结果集的顶部。如果希望它们显示在结果的顶部,则必须使用ORDERBY子句(这可能还意味着您需要能够按某物排序)

在联合的“问题”部分,使用子查询选择,使用名称和连接,在子查询中连接,然后在外部查询的选择列表中再次连接(假设子查询已经连接的三列相同)。即使没有语法错误,这也不会产生您想要的结果。您可能想做的是在子查询中进行连接(最好使用| |运算符,它可以重复使用,而不是Oracle中限制的
concat()
);将连接的结果别名为fullname,并在外部查询中选择
fullname


在你解决了这些问题之后,其他人可能会站在前面;我(我们)无法测试,因为您没有提供任何测试输入。如果需要更多帮助,请跟进/回信。祝你好运

此外,不需要任何那些
不同的
s@Nicarus是的,考虑到联合消除了重复项,它们可能是多余的。说得好。@jpw-不,你是对的。奇怪的是,它只需要2个参数:-/