2015-07-21 46 views
0

我有一個非常大的查詢,我需要在一個逗號分隔的列表我與子查詢實現這個像這樣:如何在子查詢中使用不同子句的列進行排序?

 STUFF((SELECT distinct ',' + t1.Name 
       FROM t2 
         inner join t1 ON t1.ID  = t2.ID 
       WHERE t2.otherField = 12345 
       ORDER BY t2.ID 
       FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') as talentName 

在我需要添加一個不同的條款這種特殊情況下(如圖示)。但是,當我這樣做時,出現以下錯誤:

Msg 145, Level 15, State 1, Line 2 
    ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 

我明白爲什麼會出現此錯誤,但我不知道該怎麼辦。 t2.ID不能包含在select語句中,因爲它會作爲結果集的一部分返回。我無法刪除order by子句,因爲逗號分隔列表必須與我生成ID的另一個列表匹配。

我該如何確保這個逗號分隔的列表既是獨特的,又是正確的順序?

最終目標

爲了幫助澄清什麼,我試圖完成,這個查詢將拉動t1.name和t1.ID.兩個逗號分隔的列表我目前在兩個單獨的STUFF語句中執行此操作,但是如果有其他方法,我會對它開放。這個查詢將返回幾千行,所以我試圖找到一個基於集合的解決方案,以避免每次加載我們的網頁時運行數千個即席查詢。

+0

所以目前看來沒有任何保證只有一個t2.id可以存在於特定的t1.name中。這是否強制執行?如果沒有哪個id應該用於排序? –

+0

@MartinSmith道歉;這是在數據庫中強制執行的。在ID上加入t1和t2之間有1:1的關係。我編輯了這個問題以糾正列名中的不匹配。 – Nicholas

+0

在t1中是否是唯一的名稱? –

回答

3

您可以使用派生表與GROUP BY如下。 t1.ID包含在組中,假設它是table1的PK,所以這將正確區分具有相同名稱的不同個體。

SELECT STUFF(
    ( 

    SELECT ',' + t1Name 
FROM (SELECT t1.Name AS t1Name, 
       min(t2.ID) AS t2ID 
     FROM t2 
       INNER JOIN t1 
       ON t1.ID = t2.ID 
     WHERE t2.otherField = 12345 
     GROUP BY t1.ID, 
        t1.Name) x 
ORDER BY t2ID 
FOR XML PATH('') 

, TYPE).value('.','VARCHAR(max)')    
       , 1, 1, '') as talentName 
+0

這是一個很好的解決方案,謝謝! – Nicholas

相關問題