Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2019, 15:36   #31
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а запрос из #29 работает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2019, 15:44   #32
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так:
Код:
   ...
   select max(temp0.dataoper) as MaxDate, temp0.nomerto
     from a1 temp0
     LEFT JOIN 
     (select temp2.nomerto from a1 temp2 where temp2.priz=1 GROUP BY temp2.nomerto)  AS t2 ON t2.nomerto=temp0.nomerto
     WHERE T2.nomerto IS NULL
     GROUP BY temp0.nomerto
   ) AS t2 ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.04.2019, 15:57   #33
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

попробуйте вот так
Код:
select b1.nomerto
from a1
inner join b1 on b1.nomertp =a1.nomerto
inner join (select nomerto, max(dataoper) as maxdate
             from a1
             group by nomerto
           ) as am on a1.nomerto =am.nomerto and a1.dataoper =am.maxdate
left join ( select distinct nomerto
            from a1
            where priz=1
          ) as a0 on b1.nomerto =a0.nomerto

where a0.nomerto is NULL
это все тот же ваш запрос но переделанный БЕЗ in (select ...)

а теперь внимание !
подзапрос am (тот который с макс. датой) ничего с точки зрения отбора данных не сделает.
так как все записи ИМЕЮТ какую либо дату и ...
по сути это ( select distinct nomerto ... )
его можно БЕЗБОЛЕЗНЕННО вычеркнутЬ.
В суть требований (в описание ТЗ) не вникал.

Код:
select b1.nomerto, b1.*
from  b1 
inner join ( ---требуем наличие записей с указанным nomerto
             select distinct nomerto 
             from a1 
           ) as  aa on aa.nomerto =b1.nomerto
inner join ( select nomerto, max(dataoper) as maxdate
             from a1
             group by nomerto
           ) as am on a1.nomerto =am.nomrto and a1.dataoper =am.maxdate
left join (-- проверяем наличие записей с данным nomerto и priz =1
            select distinct nomerto
            from a1
            where priz=1
          ) as a0 on a1.nomerto =a0.nomerto
where -- отказываемся от теx вариантов(nomerto) где ЕСТЬ priz =1
         a0.nomerto is NULL
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.04.2019 в 16:08.
evg_m вне форума Ответить с цитированием
Старый 26.04.2019, 16:19   #34
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

А вот запрос из #29 летает.
Снимаю шляпу. Спасибо!
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а запрос из #29 работает?
Alex_p вне форума Ответить с цитированием
Старый 26.04.2019, 16:26   #35
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

пожалуйста.

p.s. кстати, попробуйте такой запрос (с доработкой от Аватар) из #32

Код:
select b1.nomerto from b1 
inner join (
  select a1.nomerto from a1
  INNER JOIN (
   select max(temp0.dataoper) as MaxDate, temp0.nomerto
     from a1 temp0
     LEFT JOIN 
     (select temp2.nomerto from a1 temp2 where temp2.priz=1 GROUP BY temp2.nomerto)  AS t2 ON t2.nomerto=temp0.nomerto
     WHERE T2.nomerto IS NULL
     GROUP BY temp0.nomerto
   ) AS t2
  ON a1.nomerto = t2.nomerto
  AND a1.dataoper = t2.MaxDate) as t3 
ON b1.nomerto = t3.nomerto
where b1.sostojanie<>0
он должен быть ещё эффективнее.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2019, 19:10   #36
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
пожалуйста.

p.s. кстати, попробуйте такой запрос (с доработкой от Аватар) из #32

Код:
select b1.nomerto from b1 
inner join (
  select a1.nomerto from a1
  INNER JOIN (
   select max(temp0.dataoper) as MaxDate, temp0.nomerto
     from a1 temp0
     LEFT JOIN 
     (select temp2.nomerto from a1 temp2 where temp2.priz=1 GROUP BY temp2.nomerto)  AS t2 ON t2.nomerto=temp0.nomerto
     WHERE T2.nomerto IS NULL
     GROUP BY temp0.nomerto
   ) AS t2
  ON a1.nomerto = t2.nomerto
  AND a1.dataoper = t2.MaxDate) as t3 
ON b1.nomerto = t3.nomerto
where b1.sostojanie<>0
он должен быть ещё эффективнее.
И этот вариант так же быстро работает. Оставлю его, раз он теоретически эффективнее. Кстати, попробовал теперь убрать все добавленные ранее индексы - замедления на моём числе записей не чувствуется.

Спасибо всем Вам за эффективную помощь!
Alex_p вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сформировать правильно запрос Anriuser SQL, базы данных 10 01.06.2017 21:05
Помогите сформировать запрос к БД на удаление записей Kvinto БД в Delphi 2 24.10.2016 12:13
сформировать запрос megostudent Свободное общение 6 22.01.2012 21:41
сформировать запрос Ghennadiy Общие вопросы Delphi 2 12.02.2011 17:58
сформировать запрос _ILYA_ Общие вопросы C/C++ 2 24.10.2010 20:06