这是一个真实查询的简化版本,用于显示问题。它可以在示例Adventureworks数据库上执行:
SELECT Person.Address.*,
(SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId = Person.Address.StateProvinceId AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY Person.StateProvince.TerritoryId) AS [Name]
FROM Person.Address
ORDER BY [Name]这很有效,但我的问题是,如果我将排序规则添加到order by字段,我会得到一个奇怪的错误消息:
SELECT Person.Address.*,
(SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId = Person.Address.StateProvinceId AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY Person.StateProvince.TerritoryId) AS [Name]
FROM Person.Address
ORDER BY [Name] COLLATE Chinese_PRC_CI_AI错误是:
Msg 207, Level 16, State 1, Line 7
Invalid column name 'Name'.如果没有子查询,带有collate子句的查询工作得很好,但我需要这样(原因很复杂,但请相信我:)。
有谁知道这个查询失败的原因,以及可能的解决方法是什么?这是一个bug吗?
谢谢!亚当
发布于 2010-11-03 20:40:35
SQL Server不允许在order by子句中按别名引用列。例如,这将不起作用:
select id+1 as x from MyTable order by x但是您可以通过重复列定义来解决这个问题:
select id+1 as x from MyTable order by id+1或者使用子查询:
select * from (select id+1 as x from MyTable) as subquery order by x在您的示例中,最好的修复方法可能是使用子查询:
SELECT *
FROM (
SELECT Person.Address.*
, (
SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId =
Person.Address.StateProvinceId
AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY
Person.StateProvince.TerritoryId
) AS [Name]
FROM Person.Address
) as SubqueryAlias
ORDER BY
[Name]https://stackoverflow.com/questions/4086804
复制相似问题