奇怪的SELECT错误代码

时间:2012-02-14 09:46:09

标签: sql sql-server

Ho threre。当我在某些表上运行简单选择时:

SELECT
    ValidoDa, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     ValidoDa 

我可以收到错误“Ambiguous column name'ValidoDa'”

是什么原因?只有一个名为ValidoDa的文件!

你能解释一下这种行为吗?

4 个答案:

答案 0 :(得分:4)

有一个具有此名称的列,但您在SELECT列表中显示了两次!

这本身不是问题,SQL允许(尽管我认为这是该语言的一个主要设计缺陷)。

当您尝试在ORDER BY子句中使用该列时,问题会重新出现。现在(有两个同名的列)SQL抱怨它无法知道你的意思。

答案 1 :(得分:3)

ORDER BY将首先尝试解析SELECT列列表。

在这种情况下,您有ValidoDa两次因此不明确

您可以使用别名修复此问题,但无论如何SELECT *都是不好的做法

SELECT
    ValidoDa AS ValidoDaFOO, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     ValidoDa 
     -- or ValidoDaFOO

答案 2 :(得分:2)

因为你选择ValidoDa字段两次 - 一次是明确的,然后是*。

尝试

SELECT     ValidoDa,      
  Tab_Ticket_Default,     
  *  
FROM      
  Dipendente_Stor 
WHERE      
  CodiceAbi = '08753' 
  and      
  Matricola = 98 
order by       
   1

SELECT     ValidoDa,      
  Tab_Ticket_Default,     
   ** all the other fields of Dipendente_Stor **
FROM      
  Dipendente_Stor 
WHERE      
  CodiceAbi = '08753' 
  and      
  Matricola = 98 
order by       
   ValidoDa

答案 3 :(得分:2)

我想那说

order by ValidoDa 

SQL不知道要使用哪个字段:显式ValidoDa*.ValidoDa。如果你真的需要*(我会删除它),那么用别名调用第一个ValidoDa:

SELECT
    ValidoDa AS DaQuando, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     DaQuando