2012-12-06 41 views
0

運行此查詢時,我得到了「不明確的列」的錯誤,但我有一個很難找到的原因:不明確的列查詢

select bobooks.ID request,  
     bobooks.TITLE,  
     bobooks.AUTHOR,  
     bogenres.NAME genre,  
     bobooks.OWNER,  
     bostatus.NAME status,  
     bolanguages.LANGUAGE language,  
     bolanguages2.LANGUAGE secondary_language  
from BO_BOOKS bobooks  
inner join BO_GENRES bogenres 
    on bobooks.genre = bogenres.id  
inner join BO_STATUS bostatus 
    on bobooks.status = bostatus.id  
inner join BO_LANGUAGES bolanguages 
    on bobooks.language = bolanguages.id  
left outer join BO_LANGUAGES bolanguages2 
    on bobooks.secondary_language = bolanguages2.id  
where (replace(:P19_AUTHOR, ' ', '') = '' or 
     bobooks.author like '%'||:P19_AUTHOR||'%') AND  
     (replace(:P19_TITLE, ' ', '') = '' or 
     bobooks.title like '%'||:P19_TITLE||'%') AND  
     (:P14_LANGUAGE = 'all' or 
     language = :P19_LANGUAGE or 
     secondary_language = :P19_LANGUAGE) AND 
     (:P19_GENRE = 'all' or 
     genre = :P19_GENRE) AND 
     (replace(:P19_OWNER, ' ', '') = '' or 
     bobooks.owner like '%'||:P19_OWNER||'%'); 

我會搞亂的列嗎?

非常感謝你的時間!

+0

很難說沒有看到你的模式,但看着你的WHERE子句,你沒有別名你的列。在每個列上放置別名,您的問題應該消失。 –

+1

沒有你的模式,這是不可能的。但它必須是非完全限定的列之一,因此要使它們都完全合格。 – Donnie

+1

在你的WHERE子句中,你有非限定的'language','secondary_language'和'genre'。它一定是其中之一。 – Barmar

回答

4

您不能在WHERE子句中的SELECT子句中引用列別名,至少不在同一個查詢中。您可以對它進行子查詢,或者只使用原始列引用。

select  
bobooks."ID" request,  
bobooks."TITLE",  
bobooks."AUTHOR",  
bogenres."NAME" genre,  
bobooks."OWNER",  
bostatus."NAME" status,  
bolanguages."LANGUAGE" language,  
bolanguages2."LANGUAGE" secondary_language  
from BO_BOOKS bobooks  
inner join  
BO_GENRES bogenres on bobooks.genre = bogenres.id  
inner join  
BO_STATUS bostatus on bobooks.status = bostatus.id  
inner join  
BO_LANGUAGES bolanguages on bobooks.language = bolanguages.id  
left outer join  
BO_LANGUAGES bolanguages2 on bobooks.secondary_language = bolanguages2.id  
where  
(replace(:P19_AUTHOR, ' ', '') = '' 
or 
bobooks.author like '%'||:P19_AUTHOR||'%') 
AND  
(replace(:P19_TITLE, ' ', '') = '' 
or 
bobooks.title like '%'||:P19_TITLE||'%') 
AND  
(:P14_LANGUAGE = 'all' 
or 
bolanguages."LANGUAGE" = :P19_LANGUAGE 
or 
bolanguages2."LANGUAGE" = :P19_LANGUAGE) 
AND 
(:P19_GENRE = 'all' 
or 
bogenres."NAME" = :P19_GENRE) 
AND 
(replace(:P19_OWNER, ' ', '') = '' 
or 
bobooks.owner like '%'||:P19_OWNER||'%'); 
+0

非常感謝你,我很抱歉我的查詢是如此混亂,但你是完全正確的,這是問題的原因,非常感謝你的時間 –

0

在你WHERE條款,你需要引用的列在表中沒有您在SELECT列表中指定的別名。因此,您不能參考別名languagesecondary_languagegenre。您需要參考實際表格中的實際列。我敢打賭,你想要類似的東西

or 
bolanguages.LANGUAGE = :P19_LANGUAGE 
or 
bolanguages2.language = :P19_LANGUAGE) 
AND 
(:P19_GENRE = 'all' 
or 
bogenres.NAME = :P19_GENRE) 
0

這個問題真的不知道你的表結構不應答。有幾列沒有表別名(我看到languagesecondary_languagegenre),確保每列都有一個表別名,問題很可能會消失。其實,第二次看,我99%確定它是language導致的問題:你的選擇中有一個別名,BO_LANGUAGES表的兩個副本和一個BO_BOOKS表,它們都有一個字段名稱。將其更改爲WHERE子句的語言部分中的bolanguages.language(個人,我也會更改secondary_languagegenre)。