2011-03-01 19 views
16

Merhaba Cevabın başka bir yerde olması durumunda özür dilerim. Etrafa baktım ve basit bir çözüm göremedim. Çalışmak istediğim bir sorgum var. Sendika kümesinin sırasını umursamıyorum, sadece iç sorgular "En Büyük Alanlar" olan doğru verileri döndürüyor.Her bir ORDER BY cümlesi gerektiren alt sorguların Tsql birliği

(SELECT TOP 5 * FROM [geo].[Areas] WHERE CountryID = @CountryID AND (TypeID = 'City') 
ORDER BY [ShapeArea] DESC) as BiggestCities 
    UNION ALL 
(SELECT TOP 5 * FROM [geo].[Areas] WHERE CountryID = @CountryID AND (TypeID = 'National park') 
ORDER BY [ShapeArea] DESC) as BiggestParks 

Ama T-sql beni alt sorgularında SİPARİŞ BY izin vermeyeceğim, sadece bütün Birliği ... takdir Yardım! Gerçekten geçici tablolar ya da bunun gibi bir şey yaratmak zorunda kalmamayı tercih ederim.

cevap

28

bu

SELECT * 
    FROM (SELECT TOP 5 * 
      FROM [geo].[Areas] 
     WHERE CountryID = @CountryID 
      AND (TypeID = 'City') 
     ORDER BY [ShapeArea] DESC) as BiggestCities 
UNION ALL 
SELECT * 
    FROM (SELECT TOP 5 * 
      FROM [geo].[Areas] 
     WHERE CountryID = @CountryID 
      AND (TypeID = 'National park') 
     ORDER BY [ShapeArea] DESC) as BiggestParks 
+3

Fevkalade deneyin! Tam ihtiyacım olan şey. Muchas Gracias :) –

+0

de nada, Bu hızlı ve kirli, başkasının daha zarif bir şey olacağını düşündüm, denemek için zamanım olmadı @Joe Stefanelli'nin –

+0

@PaulMcCowat bana bu soruyu SQLiteQueryBuilder ile nasıl oluşturabilirim buildUnionSubQuery yöntemi ve buildUnionQuery Yöntemi ve içerik sağlayıcıları? –

2
SELECT t.* /* Excluding RowNum */ 
    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY TypeID ORDER BY [ShapeArea] DESC) as RowNum 
      FROM [geo].[Areas] 
      WHERE CountryID = @CountryID 
      AND TypeID IN ('City', 'National park') 
     ) t 
    WHERE t.RowNum <= 5 
+0

Sadece ne yazacağım - bu SELECT * "yeni" sütun RowNum dönecektir, ancak eski SELECT * tavsiyesinden kaçınıyorum. –

+0

@ Phillip: Kesinlikle SELECT * 'den kaçınmaya katılıyorum, ama burada sütun isimlerini bilmeden yapabileceğim en iyi şey.Ayrıca' SELECT' dışını belirten bir yorumun 'RowNum' sütununu içermemesi gerektiğini de not etmeliyim –

+0

Daha önce de biliyordum, ama yine de - hem bu hem de Paul'un cevabını - test ettim ve genel planın daha yavaş olacağını doğruladım. – RichardTheKiwi