2011-06-16 3 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; 

Как можно видеть, я использую тот же набор условий для получения InnerTable и OuterTable. Есть ли способ сократить этот запрос? Я спрашиваю об этом, потому что когда-то назад я увидел ключевое слово USING в MySQL, которое упростило мою жизнь, и вы можете указать запрос один раз, а затем использовать его псевдоним для остальной части запроса.

ответ

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

Смежные вопросы