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

どの列をめちゃくちゃにしていますか?

どうもありがとうございました!

4

3 に答える 3

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||'%');
于 2012-12-06T23:38:59.547 に答える
0

テーブルの構造を知らなければ、この質問に答えることはできません。テーブルエイリアスなしでリストされた列がいくつかあります(、、、およびを参照languagesecondary_languagegenreすべての列にテーブルエイリアスがあり、問題が解決する可能性が高いことを確認してください。

実際、もう一度見てみると、99%languageの確率で問題が発生しています。選択範囲にエイリアスがあり、BO_LANGUAGESテーブルのコピーが2つあり、BO_BOOKSテーブルにはすべてその名前のフィールドがあります。bolanguages.languageWHERE句の言語部分に変更します(個人的には変更secondary_languagegenreます)。

于 2012-12-06T23:45:01.387 に答える
0

WHERE句では、リストで割り当てたエイリアスではなく、テーブルの列を参照する必要がありますSELECTlanguageしたがって、エイリアス、、、secondary_languageまたはを参照することはできませんgenre。実際のテーブルの実際の列を参照する必要があります。私はあなたが次のようなものを望んでいることに賭けます

or
bolanguages.LANGUAGE = :P19_LANGUAGE
or
bolanguages2.language = :P19_LANGUAGE)
AND
(:P19_GENRE = 'all' 
or
bogenres.NAME = :P19_GENRE)
于 2012-12-06T23:39:43.413 に答える