ORDER BY仅适用于列别名

时间:2013-05-24 07:34:17

标签: sql sql-server-2008 sql-order-by

所以,我有这个查询

SELECT
    NOTES,
    DATECREATED,
    DATEMODIFIED,
    * 
FROM myTable
WHERE
    USERCREATEDBY = 465
    AND NOTES LIKE ' :%'
ORDER BY DATECREATED

并抛出此错误Ambiguous column name 'DATECREATED'

我发现我的查询没有任何问题,我通过向DATECREATED列添加别名以及按别名DATECREATED a排序的形式找到了解决方法。

我不明白为什么会这样,我很想知道为什么。

5 个答案:

答案 0 :(得分:5)

这可能是因为你选择DATECREATED两次,一次是作为一列,一次是*

SELECT *
FROM myTable
WHERE
  USERCREATEDBY = 465
  AND NOTES LIKE ' :%'
ORDER BY DATECREATED

应该可以正常工作

答案 1 :(得分:3)

因为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*/

我只是顺便提一下。绝对不是你应该这样做的建议。

答案 2 :(得分:3)

好吧,如果您的表格中包含此列DATECREATED,那么您将使用上述SELECT选择此列两次 - 一旦显式,一次隐式使用{ {1}}。

因此,您的结果集现在包含名为*两列 - 您希望将DATECREATED应用于哪一个?

显式指定所需的完整列列表,或者至少为ORDER BY列提供别名:

DATECREATED

答案 3 :(得分:1)

似乎ORDER BY无法理解应该使用哪个DATECREATED列进行排序。您在SELECT子句中指定了两次。

答案 4 :(得分:0)

试试这个:

SELECT
    NOTES,
    DATECREATED,
    DATEMODIFIED,
    * 
FROM myTable
WHERE
    USERCREATEDBY = 465
    AND NOTES LIKE ' :%'
ORDER BY 2