Oracle 11g Concat函数错误

时间:2016-08-18 22:00:11

标签: sql oracle

我遇到了这个错误:

ORA-00904:“LASTNAME”:标识符无效

尝试使用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%';

在谷歌上徘徊,但无法找到任何方法使这项工作。 请帮忙。 感谢任何意见。

威尔

2 个答案:

答案 0 :(得分:2)

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

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

choose: (event) ->
  console.log(@props.id) # This is the correct id that I want to pass into state
  @setState({
     page: @props.id # @state.page isn't being set to @props.id 
  }, () => 
      console.log(@state.name) # <-- updated value here!
  )
  console.log(@state.name) # here's old value

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

||

使代码更清洁。 (我也会尝试在显式连接的使用中保持一致 - 在派生表中,您对第一个查询使用隐式连接,对第二个查询使用显式连接。)

答案 1 :(得分:1)

除了已经指出的内容之外,这个查询还有很多错误(你从一个子查询中选择&#34; lastname&#34;它的投影不包含那个名称的列)。

当您执行UNION时,联合的第一个术语必须具有列名或别名,这些名称或别名将用于联合的所有术语。从双重中选择三个字符串(可能意味着用作标题)是不够的,您还必须为它们中的每一个提供别名。例如,select 'Full Name' as fullname, ... from dual。或者,您可以将select... from dual留待以后加入工会。

&#34;列标题&#34;显示在查询的顶部并不意味着它们将位于结果集的顶部。如果您希望它们显示在结果的顶部,则必须使用ORDER BY子句(这可能也意味着您需要能够按某种方式进行排序)。

在&#34;问题&#34; Union的一部分,带有子查询的select,带有名称和连接,你在子查询中连接,然后再次连接的外部查询的选择列表(并且假定子查询已连接的相同的三列)。即使没有语法错误,这也不会产生您想要的结果。你可能想要做的是在子查询中进行连接(最好使用可以重复使用的||运算符,而不是Oracle中有限的concat());别名连接结果as fullname,并在外部查询中选择fullname

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