【问题标题】:Alias is ignored in OrderBy在 OrderBy 中忽略别名
【发布时间】:2010-11-24 22:14:53
【问题描述】:

我们的应用程序中有两个表,它们都有一个ShowOrder 列。我们在我们的应用程序中使用 NHibernate 并使用 HQL 我们将这两个表分别按第一个表和第二个表的ShowOrder 排序。

这是我的查询的简化版本:

SELECT pr.Id as Id,pr.Title as Title, pr.ShowOrder as ShowOrder 
FROM Process pr 
    INNER JOIN ProcessGroup prg ON pr.GroupId=prg.Id 
ORDER BY prg.ShowOrder,pr.ShowOrder

一般来说,我们的应用程序可以正常运行。但是我们有一个旧应用程序和一个转换例程,用于将其数据库转换为我们的新应用程序数据库。

每当我们将旧数据库转换为新数据库时,当 SQL 服务器要执行上述查询时,就会发生错误。异常说:

按列表顺序多次指定一列

如果我们选择不带别名的pr.ShowOrder,一切正常。

似乎如果选择列表中有ShowOrder 别名,SQL Server 会忽略表别名并假定pr.ShowOrderprg.ShowOrder 相同。

【问题讨论】:

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


    【解决方案1】:

    此错误的另一个原因可能是 - 数据库兼容性级别设置为“2000-mode”(这可能在您将 SQL Server 从 2000 升级到 2005 或更高版本后发生)。 p>

    解决方案:

    “SQL Management Studio”——右键数据库——“属性”——“选项”——“兼容级别”——设置为90以上。

    【讨论】:

    • 我其实也做了同样的事情
    【解决方案2】:

    这是 ANSI SQL 的标准行为,从 2005 版本开始被 SQL Server 采用。

    ORDER BY 不会对 Source 表(FROM 子句)中的列值进行操作,而是在技术上仅对 SELECT 子句 (**) 中的 output 列值进行操作。因此,当您在 ORDER BY 子句中说“ShowOrder”时,它实际上是在使用输出列表中的 ShowOrder 值(恰好是 pr.ShowOrder)。如果你想同时使用这两个 ShowOrders,你应该把它们放在 SELECT 子句中,用不同的名字。

    当您使用 source 表别名时不叫的原因(技术上应该这样做)是为了与 SQL Server 2000 兼容,但这是一个危险的兼容性。无论您在 ORDER BY 中使用什么别名,它实际上都只使用出现在输出列表中的那个。

    (** - 是的,有一些方法可以绕过它,但它们主要是为了提供与以前版本的一些兼容性。你最好只使用标准)。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 感谢您的回答。我更改了兼容性级别,一切正常。
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多