3

所以,我有这个查询

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

它会抛出这个错误Ambiguous column name 'DATECREATED'

我发现我的查询没有任何问题,我找到了一个解决方法,即向 column 添加别名DATECREATED, like DATECREATED a,并按别名排序,ORDER BY a

我不明白为什么会发生这种情况,我很想知道为什么。

4

5 回答 5

5

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

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

应该可以正常工作

于 2013-05-24T07:36:57.453 回答
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*/

不过,我只是顺便提一下。绝对不建议您这样做。

于 2013-05-24T07:37:20.037 回答
3

好吧,如果您的表包含此 column DATECREATED,那么您将使用上述方法两次SELECT选择此列- 一次显式,一次使用*.

因此,您的结果集现在包含两列,称为DATECREATED- 您要ORDER BY应用于哪一列?

要么明确指定您需要的完整列列表,要么至少为该DATECREATED列提供一个别名:

SELECT
    NOTES,
    SecondDateCreated = DATECREATED,
    DATEMODIFIED,
    * 
FROM myTable
WHERE
    USERCREATEDBY = 465
    AND NOTES LIKE ' :%'
ORDER BY DATECREATED
于 2013-05-24T07:37:24.600 回答
1

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

于 2013-05-24T07:37:28.337 回答
0

尝试这个:

SELECT
    NOTES,
    DATECREATED,
    DATEMODIFIED,
    * 
FROM myTable
WHERE
    USERCREATEDBY = 465
    AND NOTES LIKE ' :%'
ORDER BY 2
于 2013-05-24T08:36:45.310 回答