Sql 奇怪的选择错误代码

Sql 奇怪的选择错误代码,sql,sql-server,Sql,Sql Server,好的。在某些表上运行简单的select时,如: SELECT ValidoDa, Tab_Ticket_Default, * FROM Dipendente_Stor WHERE CodiceAbi = '08753' and Matricola = 98 order by ValidoDa 我可以得到错误“不明确的列名'ValidoDa'” 原因是什么?只有一个文件名为ValidoDa 你能解释一下这种行为吗?有一列有这

好的。在某些表上运行简单的select时,如:

SELECT
    ValidoDa, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     ValidoDa 
我可以得到错误“不明确的列名'ValidoDa'”

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


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

有一列有这个名字,但是你在
选择
列表中显示了两次

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


当您尝试在
ORDER BY
子句中使用该列时,问题再次出现。现在(有两列名称相同),SQL抱怨说它不知道您指的是哪一列。

因为您选择了两次字段ValidoDa,一次显式选择,然后再次选择*

试一试

我想那句话

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

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
SELECT
    ValidoDa AS DaQuando, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     DaQuando
SELECT
    ValidoDa AS ValidoDaFOO, 
    Tab_Ticket_Default,
    * 
FROM 
    Dipendente_Stor
WHERE 
    CodiceAbi = '08753' and 
    Matricola = 98
order by 
     ValidoDa 
     -- or ValidoDaFOO