2016-08-18 50 views
-1

我遇到這個錯誤:的Oracle 11g的毗連功能錯誤

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個參數。 : -/ – Nicarus

回答

2

的錯誤似乎是你的外部查詢試圖從派生表,它不公開這個名字任何列姓氏。我猜你打算在派生表中爲別名列進行別名並選擇它。

嘗試更改查詢的開頭是:

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 

這使得代碼有點清潔。 (我也嘗試在使用顯式連接時保持一致 - 在派生表中,第一個查詢使用隱式連接,第二個顯式使用隱式連接)。

+0

此外,不需要任何'不同' – Nicarus

+0

@Nicarus是的,考慮到聯盟消除重複,它們可能是多餘的。好點子。 – jpw

1

有在此查詢了不少錯誤,除了那些已經被指出(你是從一個子查詢,其投影不含有該名稱的列中選擇「姓氏」)。

當你做一個聯盟,聯盟的第一項必須有列名或別名,這將用於工會的所有條款。從雙重選擇三個字符串(可能意味着用作標題)是不夠的,您還必須給每個字符串一個別名。例如,select 'Full Name' as fullname, ... from dual。或者,您可以離開select... from dual以便稍後參加工會。

的「列標題」在查詢的頂部顯示的事實並不意味着他們會在結果集的頂部。如果您希望它們顯示在結果的頂部,則必須使用ORDER BY子句(這也許意味着您需要能夠按某種方式排序)。

在聯盟的「問題」部分,選擇帶有子查詢的名稱和連接,在子查詢中連接,然後在外部查詢的選擇列表中重新連接(並且應該是相同的子查詢已經連接了三列)。即使沒有語法錯誤,這也不會產生你想要的結果。你可能想要做的是在子查詢中進行連接(最好使用可重複使用的||運算符,而不是在Oracle中受限制的concat());別名連接結果as fullname,並在外部查詢中選擇fullname

解決這些問題後,其他人可能會出現在前面;我(我們)無法測試,因爲您沒有提供任何測試輸入。如果您需要更多幫助,請跟進/回覆。祝你好運!