运行此查询时出现“模糊列”错误,但我很难找到原因:
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 :(得分: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||'%');
答案 1 :(得分:0)
在WHERE
子句中,您需要引用表中的列,而不是您在SELECT
列表中指定的别名。因此,您无法引用别名language
,secondary_language
或genre
。您需要参考实际表中的实际列。我打赌你想要像
or
bolanguages.LANGUAGE = :P19_LANGUAGE
or
bolanguages2.language = :P19_LANGUAGE)
AND
(:P19_GENRE = 'all'
or
bogenres.NAME = :P19_GENRE)
答案 2 :(得分:0)
如果不知道你的表结构,这个问题真的无法回答。列出了几个没有表别名的列(我看到language
,secondary_language
和genre
),请确保每个列都有一个表别名,问题很可能会消失。
实际上,再看看,我99%肯定它是language
导致问题:你的select中有一个别名,BO_LANGUAGES表的两个副本和一个BO_BOOKS表都有一个具有该名称的字段。在WHERE子句的语言部分将其更改为bolanguages.language
(就个人而言,我也会更改secondary_language
和genre
)。