2012-02-14 68 views
2

Ho threre。当我运行一个简单的像一些表中进行选择:奇怪的SELECT错误代码

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

我可以得到错误“不明确的列名‘ValidoDa’”

的原因是什么?只有一个字段叫ValidoDa!

你能解释这种行为吗?

回答

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 
4

有一列有这个名字,但你在SELECT列表中显示两次!

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

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

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 
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