题
这是真正查询的简化版本来显示问题。它可以在示例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]
这效果很好,但是我的问题是,如果我按字段将整理添加到订单中,我会收到一个奇怪的错误消息:
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'.
如果没有子查询,则与“综合”子句的查询效果很好,但是我需要这样的问题(出于复杂的原因,但请相信我:))。
有人知道为什么此查询失败了,还有什么可能是解决方法?这是一个错误吗?
谢谢!亚当
解决方案
SQL Server不允许您按子句中的顺序中的别名引用列。例如,这行不通:
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]
不隶属于 StackOverflow