2011-06-16 84 views
2

我有這樣的查詢:有沒有辦法縮短這個查詢?

SELECT Name, 
REPLACE(RTRIM((
       SELECT CAST(Score AS VARCHAR(MAX)) + ' ' 
       FROM 
        (SELECT Name, Score 
        FROM table 
        WHERE 
        ---CONDITIONS--- 
        ) AS InnerTable    
       WHERE (InnerTable.Name = OuterTable.Name) FOR XML PATH (''))),' ',', ') AS Scores 
FROM table AS OuterTable 
WHERE 
---CONDITIONS--- 
GROUP BY Name; 

如可以看到,我使用的是同一套條件推導InnerTableOuterTable。有沒有辦法縮短這個查詢?我問這個問題是因爲在某些時候,我看到MySQL中的關鍵字USING簡化了我的生活,您可以使用它來指定查詢一次,然後將其別名用於查詢的其餘部分。

回答

3

你可以看看創建一個公用表表達式(CTE)。這是你選擇別名的最佳選擇。不幸的是,我不確定它會使你的查詢有多少支持,儘管它阻止了你兩次定義條件。見下:

with temp as 
(
    SELECT Name, Score 
    FROM table 
    WHERE whatever = 'whatever' 
) 

SELECT Name, 
REPLACE(RTRIM((
       SELECT CAST(Score AS VARCHAR(MAX)) + ' ' 
       FROM 
        (SELECT Name, Score 
        FROM temp     ) AS InnerTable    
       WHERE (InnerTable.Name = OuterTable.Name) FOR XML PATH (''))),' ',', ') AS Scores 
FROM temp AS OuterTable 
GROUP BY Name; 
+1

+1謝謝你的時間。我認爲這是我需要的。它使我的查詢更具可讀性。當定時器到期時,我會接受這個答案。 :) – Legend 2011-06-16 19:03:49