【问题标题】:Ambiguous column query不明确的列查询
【发布时间】:2012-12-06 23:25:46
【问题描述】:

我在运行此查询时收到“不明确的列”错误,但我很难找到原因:

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

我搞砸了哪些列?

非常感谢您的宝贵时间!

【问题讨论】:

  • 很难说没有看到你的架构,但是看看你的 WHERE 子句,你没有为你的列加上别名。为每一列添加一个别名,您的问题应该会消失。
  • 没有你的模式是不可能的。但它必须是非完全限定的列之一,因此使它们都完全限定。
  • 在您的 WHERE 子句中,您有不合格的 languagesecondary_languagegenre。它一定是其中之一。
  • 这是完整的错误信息吗?
  • 违规列的名称是什么?

标签: sql oracle plsql multiple-columns ambiguous


【解决方案1】:

您不能在 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||'%');

【讨论】:

  • 非常感谢,很抱歉我的查询太混乱了,但您说的完全正确,这就是问题的原因,非常感谢您抽出宝贵的时间
【解决方案2】:

在您的WHERE 子句中,您需要引用表中的列而不是您在SELECT 列表中分配的别名。因此您不能引用别名languagesecondary_languagegenre。您需要参考实际表中的实际列。我打赌你想要类似的东西

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

【讨论】:

    【解决方案3】:

    如果不知道您的表结构,这个问题确实无法回答。列出了一些没有表别名的列(我看到了languagesecondary_languagegenre),请确保每列都有一个表别名,问题很可能会消失。

    实际上,再看一遍,我 99% 确定是 language 导致了问题:您的选择中有一个别名、BO_LANGUAGES 表的两个副本和一个 BO_BOOKS 表,它们都有一个字段那个名字。在 WHERE 子句的语言部分将其更改为 bolanguages.language(我个人也会更改 secondary_languagegenre)。

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多