2012-06-27 2 views
1

У меня есть ЗЕЬЕСТ вроде этого:ВЫБРАТЬ в SQL Server - альтернатива подзапрос

SELECT 
T1.COD, 
T1.NAME, 
(SELECT MAX(T2.DATA) 
    FROM dbo.TAB2 T2 
    WHERE T2.COD = T1.COD) AS ENDDATA 
FROM dbo.TAB1 AS T1 WITH (NOLOCK) 

Есть ли альтернатива использовать подзапрос? Можно ли использовать JOIN?

Мне нужно найти более эффективное решение для запуска этого запроса.

спасибо.

+0

Подзапрос в порядке, так как без него вам придется «лечь» (выберите max (данные), код из группы dbo.tab2 по коду) t2 on t1.code = t2.code' – SQLMason

ответ

0

Да, вы можете использовать JOIN:

SELECT 
    T1.COD, 
    T1.NAME, 
    MAX(T2.DATA) AS ENDDATA 
FROM dbo.TAB1 AS T1 WITH (NOLOCK) 
JOIN dbo.TAB2 T2 WITH (NOLOCK) -- Assumed 
    ON T2.COD = T1.COD 
GROUP BY 
    T1.COD, 
    T1.NAME 
0
SELECT T1.COD, 
     T1.NAME, 
     MAX(T2.DATA) 
FROM  TAB1 AS T1 
JOIN  TAB2 AS T2 
ON  T2.COD = T1.COD 
GROUP BY T1.COD, 
     T1.NAME; 
1

Чтобы вернуть те же результаты, что и исходный запрос, вам необходимо следующее:

SELECT T1.COD, T1.NAME, s.ENDDATA 
FROM dbo.TAB1 T1 WITH (NOLOCK) left outer join 
    (SELECT t2.cod, MAX(T2.DATA) as EndData 
     FROM dbo.TAB2 T2 
     group by T2.COD 
    ) s 
    on t1.cod = s.cod 

Выполнение группы по вне присоединиться изменяет семантику запроса. В частности, вы возвращаете только одну строку на COD/NAME, хотя в T1 могут быть дубликаты. Это может быть желательным. Но ваш исходный запрос будет иметь дубликаты.

Кроме того, почему у вас есть NOLOCK на TAB1, но не на TAB2?

0

Почему вы не хотите использовать подзаголовок? Вы можете заменить его на внешний применимый оператор (который выглядит лучше с моей точки зрения), но в большинстве случаев вы получите тот же план выполнения. Да, на самом деле это зависит от ваших индексов (я предполагаю, что у вас есть индекс на COD в таблице TAB2) и данных (я полагаю, что количество строк в обеих таблицах более или менее велико, а количество строк в TAB2 определенно больше, чем количество строк в TAB1).

Решение с группировкой на ХПК и ИМЯ является наихудшим решением. Решение с подзапросом идентично внешнему. Решение с наружным применением является более или менее хорошим решением (даже лучше использовать крест, но в этом случае вы должны быть уверены, что в TAB1 нет строк, не имеющих связанных строк в TAB1).

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