MS SQL 2005 - Order by Collate with subser sub
-
28-09-2019 - |
سؤال
هذه نسخة مبسطة من استعلام حقيقي لإظهار المشكلة. يمكن تنفيذها على قاعدة بيانات 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]
لا تنتمي إلى StackOverflow