|
|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : Tolik Tentser 2:5020/400 23 Feb 2001 18:58:38 To : All Subject : Re: (select) -> join ? -------------------------------------------------------------------------------- Hi, Vladimir Ivanov! В чреве акулы, пойманной Thu, 22 Feb 2001 09:48:00 +0300, дети капитана Гранта нашли письмо на тему '(select) -> join ?': > >> Все верно, в учебниках Microsoft прямо указано, что вложенные запросы > >> работают очень медленно и их надо избегать. > > TT> Ты (или учебники) сильно не прав. >Приведи пример. Легко. Hапример: SELECT T1.*, T2.AAA FROM T1 LEFT JOIN T2 ON T1.Id = T2.T1Id AND T2.SomeField = XXX WHERE ... достаточно часто (на 7) дает попытку сделать сначала отбор по T2.SomeField, затем TableSpool полученного результата, затем JOIN этого всего с T1. Причем - несмотря на UNIQUE CONSTRAINT T2(T1Id, SomeField) И достаточно часто это есть криво и медленно. Лечится - банальным переписыванием SELECT T1.*, (SELECT AAA FROM T2 WHERE T1.Id = T1Id AND SomeField = XXX) AS AAA FROM T1 WHERE ... Это один пример, реально - их таких весьма много >Вообще замечу, я ставил другой вопрос, как избавится от >(select). Был бы благодарен за совет. >select An1, sum(debet) from Saldo S >where Account=@Account and >DateIdx in (select max (DateIdx) from Saldo > where DateIdx<@ToIdx and Account=S.Account and AnPacket=S.AnPacket) >group by An1 А никак не избавляться Hапиши: select An1, sum(debet) from Saldo S where Account=@Account and DateIdx = (select top 1 DateIdx from Saldo where DateIdx<@ToIdx and Account=S.Account and AnPacket=S.AnPacket order by DateIdx desc) group by An1 Подзапрос с SELECT TOP 1 у них как раз как правило выполняется очень быстро Bye ... Тенцер А.Л. tolik@katren.nsk.ru ICQ 15925834 --- ifmail v.2.15dev5 * Origin: AO Katren (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/208070977105.html, оценка из 5, голосов 10
|