2012-12-06 7 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 절에서 열 별칭을 참조 할 수 없습니다. 적어도 동일한 쿼리는 아닙니다. 당신은 그것을 서브 쿼리 할 수도 있고 원래의 컬럼 참조를 사용할 수도 있습니다. 당신의 WHERE 절에서

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

, 당신은 테이블에 당신이 SELECT 목록에 할당하지 별칭을 열을 참조 할 필요가있다. 따라서 language, secondary_language 또는 genre이라는 별칭을 참조 할 수 없습니다. 실제 테이블의 실제 열을 참조해야합니다. 나는 당신이 무언가를 원한다고 내기 할 것입니다.

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

질문은 정말로 당신의 테이블 구조를 알지 못하면 답할 수 없습니다. 테이블 별칭이없는 열이 몇 개 있는데 (language, secondary_languagegenre), 모든 열에 테이블 별칭이 있는지 확인하고 문제가 사라질 가능성이 높습니다.

실제로 두 번째로 살펴보면 문제가되는 원인은 language입니다. 선택 항목에 별칭이 있고 BO_LANGUAGES 테이블이 두 개 있고 BO_BOOKS 테이블에 모두 필드가있는 것입니다. 이름. WHERE 절의 언어 부분에서 bolanguages.language으로 변경하십시오 (개인적으로 secondary_languagegenre도 변경합니다).