2016-08-18 8 views
-1

나는이 오류가 발생 해요 :오라클 11g CONCAT 함수 오류

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%'; 

방황하지만이 작동 할 수있는 방법을 찾을 수 없습니다. 도와주세요. 모든 입력을 감사하십시오.

+0

@ jpw - 아니, 맞습니다.이상하게도 2 args 걸립니다. :/ – Nicarus

답변

2

오류는 외부 쿼리가 그 이름을 가진 열을 노출하지 않는 파생 테이블에서 LASTNAME 선택을 시도하는 것 같다. 파생 테이블에서 연결된 열의 별칭을 지정하고 선택하는 것 같습니다. 나는이 비록 오라클 마찬가지입니다 확실하지 않다, 두 개 이상의 인수를 취할 수 CONCAT 일부 데이터베이스와

SELECT 'Full Name','User Name', 'Email' FROM Dual 
UNION ALL 
SELECT fullname, username, Email 
FROM 
(
select distinct firstname || ' ' || lastname as fullname, username, Email 

,하지만 당신은 할 수 있어야 :

이에 쿼리의 시작을 변경해보십시오 이에 중첩 된 CONCAT 함수를 연결 연산자 ||를 사용하여 변경 : 코드를 조금 청소기를 만드는

firstname || ' ' || lastname as fullname 

합니다. (또한 명시 적 조인을 일관되게 사용하려고 시도합니다. 파생 테이블에서 첫 번째 쿼리에는 암시 적 조인을 사용하고 두 번째 쿼리에는 명시 적 조인을 사용합니다.)

+0

또한, 그 별개의 것들에 대한 필요가 없습니다 – Nicarus

+0

@Nicarus 네, 노동 조합이 중복을 제거한다면 그것은 아마도 중복됩니다. 좋은 지적. – jpw

1

이 쿼리에는 많은 실수가 있습니다. 이미 지적 된 것 외에 (그 이름으로 열을 포함하지 않는 하위 쿼리에서 "성"을 선택합니다).

UNION을 수행 할 때, UNION의 첫 번째 용어에는 열 이름이나 별칭이 있어야하며, 이는 UN의 모든 조건에 사용됩니다. 이중에서 세 개의 문자열을 선택하는 것으로 충분하지는 않습니다 (헤더로 사용되기도 함). 각 문자열에 별칭을 지정해야합니다. 예 : select 'Full Name' as fullname, ... from dual. 또는 나중에 select... from dual을 노동 조합에 남겨 둘 수 있습니다.

"열 머리글"이 쿼리의 맨 위에 표시되었다고해서 결과 집합의 맨 위에 있다는 것을 의미하지는 않습니다. 결과의 맨 위에 표시되도록하려면 ORDER BY 절을 사용해야합니다 (아마도 주문으로 주문할 수 있어야합니다).

유니온의 "문제"부분에서 하위 쿼리에서 연결 한 하위 쿼리를 선택하고 하위 쿼리에서 연결 한 다음 외부 쿼리의 선택 목록에서 다시 연결합니다 (그리고 아마도 같은 하위 쿼리가 이미 연결된 세 개의 열). 구문 오류가없는 경우에도 원하는 결과를 얻을 수 없습니다. 아마도 하위 쿼리에서 연결을 수행하는 것입니다 (그리고 오라클에서 제한적으로 사용되는 concat() 대신에 반복적으로 사용할 수있는 || 연산자를 사용하는 것이 가장 좋습니다). 연결 as fullname의 결과에 별칭을 지정하고 외부 쿼리에서 fullname을 선택합니다.

이러한 문제를 해결 한 후에 다른 문제가 발생할 수 있습니다. 테스트 입력이 없으므로 테스트 할 수 없습니다. 추가 도움이 필요하면 후속/회신 메일을 보내주십시오. 행운을 빕니다!