0

これは、問題を示すために実際のクエリを簡略化したものです。サンプルの 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'.

サブクエリがない場合、collat​​e 句を使用したクエリはうまく機能しますが、このようにする必要があります (複雑な理由で、信じてください :))。

このクエリが失敗する理由と、可能な回避策を知っている人はいますか? これはバグですか?

ありがとう!アダム

4

1 に答える 1

2

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]
于 2010-11-03T12:40:35.080 に答える