2010-08-23 2 views
1

У меня есть следующий запрос:Преобразовать запрос, чтобы использовать только таблицу один раз

select field1,field2 from 
#table1 left join 
(select field3, max (field4) as field2 
from #table1 
group by field3) a on #table1.field3 = a.field3 

Я хочу изменить его так # table1 используется только один раз (и, предпочтительно, наиболее эффективным способом также)

Любые идеи ?

Спасибо!

+0

Подумайте, как вы можете ответить на запрос, используя таблицу только один раз. Если вы не можете придумать такую ​​процедуру, возможно, ее нет. Учитывая характер запроса, я думаю, что нет возможности избежать использования таблицы дважды - вам нужно присоединиться к сводке таблицы с исходными данными; вам нужно обработать таблицу дважды. Есть ли что-то, что заставляет вас думать, что это можно сделать, чтобы таблица использовалась только один раз? –

+0

Последняя строка: a.site_id не определен. Должно ли это быть полем3? –

+0

@stefan - да, это должно было – kralco626

ответ

2
SELECT field1, MAX(field4) OVER (PARTITION BY field3) AS field2 
FROM #table1 

Хотя следующие разъяснения в комментариях ...

Я думаю, что я действительно искал была одна запись в field3, то макс (Field4) и соответствующий field1. И я думаю, что предположение бы быть сделано, что field1 и field3 имеет строго один-много отношений (иначе значение field3 никогда не может иметь два соответствующих значения field1)

... Я думаю, что это то, что вам действительно нужно.

WITH cte As 
(
SELECT field1, field3,field4, 
ROW_NUMBER() OVER (PARTITION BY field3 ORDER BY field4 DESC) AS RN 
FROM #table1 
) 
SELECT field1, field3,field4 
FROM cte 
WHERE RN=1 
+0

Спасибо! Итак, это должно дать мне строку для каждого уникального значения поля3? Что произойдет в случае, если одно значение поля 3 соответствует двум значениям поля1? – kralco626

+0

Я думаю, чтобы ответить на мой собственный вопрос, вы получите две строки, потому что единственное, что определяет строки, - field3. – kralco626

+0

Это должно быть точно так же, как и ваш примерный запрос. Он вернет все строки в '# table1' (у вас есть левое соединение). Для каждой строки он вернет максимальное значение 'field4', соответствующее этому значению' field3', и будет иметь такой же результат как 'field2' –

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