سؤال

هذه نسخة مبسطة من استعلام حقيقي لإظهار المشكلة. يمكن تنفيذها على قاعدة بيانات Sample 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'.

يعمل الاستعلام مع جملة Collate بشكل جيد إذا لم يكن هناك مسافة فرعية ، لكنني بحاجة إلى أن يكون هكذا (لسبب معقد ، ولكن من فضلك صدقني :)).

هل يعرف أي شخص سبب فشل هذا الاستعلام ، وما الذي يمكن أن يكون حلًا محتملًا؟ هذا الخلل؟

شكرًا! آدم

هل كانت مفيدة؟

المحلول

لا يسمح لك 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]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top