![](/img/trans.png)
[英]Why ORDER BY works only when I gave an alias name for the column, but didn't work just as column name?
[英]ORDER BY works only with column alias
所以,我有这个问题
SELECT
NOTES,
DATECREATED,
DATEMODIFIED,
*
FROM myTable
WHERE
USERCREATEDBY = 465
AND NOTES LIKE ' :%'
ORDER BY DATECREATED
并抛出此错误Ambiguous column name 'DATECREATED'
。
我发现我的查询没有任何问题,我发现了一个修复方法,即在DATECREATED
列中添加别名,如DATECREATED a
,并按别名ORDER BY a
排序。
我不明白为什么会这样,我很想知道为什么。
这可能是因为你选择DATECREATED两次,一次是作为一列,一次是*
SELECT *
FROM myTable
WHERE
USERCREATEDBY = 465
AND NOTES LIKE ' :%'
ORDER BY DATECREATED
应该工作正常
因为DATECREATED
两次出现在SELECT
列表中。
在这种情况下,两个实例都引用相同的基础列,但它仍然是无效的语法。 通常,您可以使用两个具有相同名称的投影列来引用不同的列。
SELECT
DATECREATED AS D,
DATEMODIFIED AS D
FROM myTable
ORDER BY D /*Obviously ambiguous*/
顺便说一下,将任何类型的表达式应用于ORDER BY DATECREATED
可以解决歧义,因为它将针对基表中的列进行解析。
CREATE TABLE myTable
(
NOTES VARCHAR(50),
DATECREATED DATETIME,
DATEMODIFIED DATETIME
)
SELECT
NOTES,
DATECREATED,
DATEMODIFIED,
*
FROM myTable
ORDER BY DATECREATED + 0 /*Works fine*/
我只是顺便提一下。 绝对不是你应该这样做的建议。
好吧,如果你的表包含DATECREATED
这个列,那么你用上面的SELECT
选择这个列两次 - 一次显式,一次隐式使用*
。
所以你的结果集现在包含两个名为DATECREATED
列 - 你想要将ORDER BY
应用DATECREATED
一列 ?
要么显式指定所需的完整列列表,要么至少为DATECREATED
列提供别名:
SELECT
NOTES,
SecondDateCreated = DATECREATED,
DATEMODIFIED,
*
FROM myTable
WHERE
USERCREATEDBY = 465
AND NOTES LIKE ' :%'
ORDER BY DATECREATED
似乎ORDER BY
无法理解应该使用哪个DATECREATED
列进行排序。 您在SELECT
子句中指定了两次。
尝试这个:
SELECT
NOTES,
DATECREATED,
DATEMODIFIED,
*
FROM myTable
WHERE
USERCREATEDBY = 465
AND NOTES LIKE ' :%'
ORDER BY 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.