繁体   English   中英

ORDER BY仅适用于列别名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM