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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2018, 21:16   #21
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
так напишите, думаю, что ТС это пригодится (хотя бы в качестве варианта или попытки)
Вы не подумайте ничего плохого, просто может на будущее как нибудь пригодится..

Цитата:
так напишите, думаю, что ТС это пригодится
я пример кинул свой ТС не отписал работает или нет, если он откликнется я напишу. а писать в пустоту тоже нет желания

Цитата:
так я же и говорю, неизвестно, какая версия FireBird и что она поддерживает.
в том числе если еще автор и версию назовет своей птицы
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 27.04.2018, 10:04   #22
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
без БД и без возможности попробовать трудно в уме сочинять сложные запросы.
Банально не знаешь - "съест" СУБД такую конструкцию или есть какие-то ограничения.

ну, попробуйте такой запрос:

Код:
select a1.nomerto, a1.Hardware, a1.dataoper
from a1 
INNER JOIN (
select max(temp0.dataoper) as MaxDate, temp0.nomerto  
from a1 temp0 
where temp0.nomerto not in 
   (select temp2.nomerto from a1 temp2 where temp2.priz=1)
GROUP BY temp0.nomerto
) AS t2
  ON a1.nomerto = t2.nomerto 
  AND a1.dataoper = t2.MaxDate
Огромное Вам спасибо! Это именно то, что нужно. Запрос выбирает из таблицы a1 самые новые по dataoper записи для тех nomerto, у которых в таблице a1 ни разу не встречается priz=1. Осталось понять сам текст запроса
Alex_p вне форума Ответить с цитированием
Старый 27.04.2018, 10:55   #23
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
Код:
SELECT NOMERTO FROM ( 
	SELECT NOMERTO, PRIZ FROM a1
	WHERE PRIZ <> 1
) AS T1
GROUP BY 
	T1.NOMERTO 
ORDER BY dataoper DESC
Этот запрос вполне логично ругается на dataoper. Первый его вариант (без ORDER BY dataoper DESC) выбирал все NOMERTO для которых в таблице a1 поле PRIZ хоть раз было равно 0. А это - почти у всех NOMERTO...
А нужно - выбрать из таблицы a1 самые новые по dataoper записи для тех nomerto, у которых в таблице a1 ни разу не встречается priz=1.
Alex_p вне форума Ответить с цитированием
Старый 27.04.2018, 11:01   #24
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
Вы не подумайте ничего плохого, просто может на будущее как нибудь пригодится..

я пример кинул свой ТС не отписал работает или нет, если он откликнется я напишу. а писать в пустоту тоже нет желания

в том числе если еще автор и версию назовет своей птицы
Огнептица 3.0+. Проблема решена (см. #22) Но если предложите другие варианты решения - буду благодарен.
Alex_p вне форума Ответить с цитированием
Старый 27.04.2018, 12:59   #25
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Огнептица 3.0+. Проблема решена (см. #22) Но если предложите другие варианты решения - буду благодарен.
мой вариант будет сложнее для понимания, поэтому наверное нет смысла тратить время, понять что и как в запросе Serge_Bliznykov будет проще. Но быть может ради доп варианта скину (когда нечего будет делать)
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 26.04.2019, 11:41   #26
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Alex_p Посмотреть сообщение
Огромное Вам спасибо! Это именно то, что нужно. Запрос выбирает из таблицы a1 самые новые по dataoper записи для тех nomerto, у которых в таблице a1 ни разу не встречается priz=1. Осталось понять сам текст запроса
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
без БД и без возможности попробовать трудно в уме сочинять сложные запросы.
Банально не знаешь - "съест" СУБД такую конструкцию или есть какие-то ограничения.

ну, попробуйте такой запрос:

Код:
select a1.nomerto, a1.Hardware, a1.dataoper
from a1 
INNER JOIN (
select max(temp0.dataoper) as MaxDate, temp0.nomerto  
from a1 temp0 
where temp0.nomerto not in 
   (select temp2.nomerto from a1 temp2 where temp2.priz=1)
GROUP BY temp0.nomerto
) AS t2
  ON a1.nomerto = t2.nomerto 
  AND a1.dataoper = t2.MaxDate
Здравствуйте. Задача немного усложнилась. Теперь запрос должен выбирать данные с учетом значений полей nomerto и sostojanie в ещё одной таблице - b1. Дописал таким образом:

select nomerto from b1 where b1.nomerto IN (select a1.nomerto, a1.Hardware, a1.dataoper
from a1
INNER JOIN (
select max(temp0.dataoper) as MaxDate, temp0.nomerto
from a1 temp0
where temp0.nomerto not in
(select temp2.nomerto from a1 temp2 where temp2.priz=1)
GROUP BY temp0.nomerto
) AS t2
ON a1.nomerto = t2.nomerto
AND a1.dataoper = t2.MaxDate) AND b1.sostojanie<>0

Работает. Но выполняется почти 10 сек на несчастной 1000 записей! Подскажите, пожалуйста, как можно это ускорить?
Alex_p вне форума Ответить с цитированием
Старый 26.04.2019, 12:01   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alex_p Посмотреть сообщение
Подскажите, пожалуйста, как можно это ускорить?
добавьте индекс на поля
a1.nomerto
a1.dataoper
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2019, 15:08   #28
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
добавьте индекс на поля
a1.nomerto
a1.dataoper
Попробовал. Не помогло. Может на долю секунды и меньше, но всё равно "программа не отвечает" примерно 10 сек.
Alex_p вне форума Ответить с цитированием
Старый 26.04.2019, 15:17   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а такой запрос что выдаёт ?

Код:
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
   where temp0.nomerto not in
   (select temp2.nomerto from a1 temp2 where temp2.priz=1)
   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

p.s. кстати, в таблице b1 по полю nomerto индекс не забыли сделать?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2019, 15:18   #30
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Alex_p Посмотреть сообщение
Попробовал. Не помогло. Может на долю секунды и меньше, но всё равно "программа не отвечает" примерно 10 сек.
ЗЫ: Интересно. Добавил ещё индекс на поле priz. Стало примерно 2 сек. Хоть всё равно не моментально...

в таблице b1 по полю nomerto индекс делал тоже. не помогало.
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