Перейти из форума на сайт.


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Открыть новую тему     Написать ответ в эту тему

llleopevzner

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то так:
 
declare
  testing_string varchar2(50);
  pattern_string varchar2(50);
  function tst(aStr in varchar2) return varchar2
  is
    res varchar2(200);
  begin
    for i in (select substr(mask,level,1) lt,level lvl from (select aStr mask from dual) t connect by level<=length(mask)) loop
      if instr('0123456789',i.lt)>0 then res:=res||'('||i.lt||')';
      elsif i.lt='_' then res:=res||'([[:digit:]])';
      else  
        if instr(aStr,i.lt)<i.lvl then res:=res||'(\'||instr(aStr,i.lt)||')';
        else res:=res||'([[:digit:]])';
        end if;
      end if;          
    end loop;
    return res;
  end;
begin
  testing_string:='121223322';
  pattern_string:='1_1AABBAA';
  if regexp_like(testing_string,tst(pattern_string)) then  
    dbms_output.put_line('match');
  else  
    dbms_output.put_line('not match');
  end if;
end;

Всего записей: 32 | Зарегистр. 11-12-2005 | Отправлено: 13:25 17-05-2017
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть табличка со столбцом DATE_TIME и столбцом типа NUMBER:
DT            A
03.05.2011 00:00        1
02.05.2011 23:20        4
02.05.2011 23:01        4
02.05.2011 23:00        4
02.05.2011 22:16        3
02.05.2011 22:05        3
02.05.2011 22:00        7
 
Подскажите, как из нее получить следующее:
DT            A
03.05.2011 00:00        9
02.05.2011 23:00        10
02.05.2011 22:00        7
 
Т.е. необходимо посчитать сумму по часам за период (23.01..00.00 включительно, 22.01..23.00 и т.д.).
 
Пробовал вариант с GROUP BY по TRUNC(DT, 'HH24'), но он суммирует за период 23.00..23.59 и т.д.

Всего записей: 950 | Зарегистр. 19-08-2005 | Отправлено: 20:47 11-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Unnicked
В начале dateadd-ом DT на минуту назад сдвинуть...

Всего записей: 1272 | Зарегистр. 10-07-2013 | Отправлено: 21:03 11-08-2017 | Исправлено: Alexzzy, 23:29 11-08-2017
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
А одним запросом возможно?

Всего записей: 950 | Зарегистр. 19-08-2005 | Отправлено: 10:06 13-08-2017
KDPoid



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Unnicked
Вы же свой результат с group by одним запросом получили?
Просто из DT вычтите минуту тем способом, который поддерживает ваша СУБД.

Всего записей: 387 | Зарегистр. 08-08-2006 | Отправлено: 13:52 13-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток!
Давно не брал в руки шашек, но админ заболел - приходится самому разбираться на хозяйстве.
Задачу поставили такую: есть каскад связанных таблиц, из таблицы_1 по условию отбираются id1, по этим id1 из таблицы_2 выбираются id2 и по ним из таблицы_3 тянутся данные.
Точно помню, что городить запрос select data from table3 t3 where t3.id in (select id2 from table_2 t2 where t2.id in (select id1 from table_1 t1 where t1.param like '%someshit%') это лютый звездец и ваще не взлетит.
В какую сторону мне копнуть, чтобы красиво реализовать запрос?

Всего записей: 237 | Зарегистр. 06-05-2003 | Отправлено: 15:01 15-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Типа такого
select t3.data  
from table_1 t1, table_2 t2, table3 t3  
where t1.param like '%someshit%' and
    t1.id1 = t2.id1 and
    t2.id2 = t3.id2

Всего записей: 1272 | Зарегистр. 10-07-2013 | Отправлено: 17:40 15-08-2017 | Исправлено: Alexzzy, 17:41 15-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Типа такого
select t3.data  
from table_1 t1, table_2 t2, table3 t3  
where t1.param like '%someshit%' and
    t1.id1 = t2.id1 and
    t2.id2 = t3.id2

Благодарствую, попробовал. Работает, но дооооолго.
Запилил с join'ами - тоже работает, но тоже дооооолго.
select data.t3 from table3 t3
left join table2 t2
on t3.id3=t2.id2
left join table1 t1
on t2.id2=t1.id1
where
t1.param like '%someshit%'
 
Быстрее всего руками выполнить три запроса подряд и подставить результаты одного в другой

Всего записей: 237 | Зарегистр. 06-05-2003 | Отправлено: 18:47 15-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
но дооооолго

Значит структура не оптимальная без первичных ключей и индексов.

Всего записей: 1272 | Зарегистр. 10-07-2013 | Отправлено: 20:27 15-08-2017
andyzubov

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, при наличии индексов столь тривиальный запрос должен отрабатывать очень быстро. Хотя конечно может у вас там исходные таблицы в сотни ТБ

Всего записей: 59 | Зарегистр. 02-04-2015 | Отправлено: 11:12 17-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да, при наличии индексов столь тривиальный запрос должен отрабатывать очень быстро. Хотя конечно может у вас там исходные таблицы в сотни ТБ

Если бы... Просто база унылое Г - индексы делали кое-где и кое-как, fk - на одной таблице из пяти есть и это в лучшем случае.

Всего записей: 237 | Зарегистр. 06-05-2003 | Отправлено: 15:48 18-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Админ за что деньги то получает? Проиндексировать не проблема.

Всего записей: 1272 | Зарегистр. 10-07-2013 | Отправлено: 20:23 18-08-2017 | Исправлено: Alexzzy, 20:23 18-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Админ за что деньги то получает? Проиндексировать не проблема.

Знал бы прикуп - жил бы не там, где живу
 
Продолжают свой секс с sql'ем.  
Нужно в запросе вернуть данные из одной таблицы с заменой (замену делаю case'ом), но если встречается определенный id'шник, то надо слазить в другую таблицу, посмотреть на id в ней и если он равен 1, то 1 и вернуть, если <> 1, то вернуть 2). Такое ощущение, что в case надо засунуть select с еще одним case'ом... Но, если память мне не изменяет - так не летает...

Всего записей: 237 | Зарегистр. 06-05-2003 | Отправлено: 16:06 21-08-2017
AlexCoRu

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С таким лайком %someshit% и не взлетит. Нужен полнотекстовый поиск/индекс. А это уже сецифично для конкретной СУБД.

Всего записей: 829 | Зарегистр. 04-09-2003 | Отправлено: 17:12 21-08-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
Такое ощущение, что в case надо засунуть select с еще одним case'ом

Попробуйте:  

Код:
 
select data.t3  

, CASE WHEN  t4.{id} = 1 THEN 1
  ELSE 2 END AS new_value

from table3 t3
left join table2 t2
on t3.id3=t2.id2
left join table1 t1
on t2.id2=t1.id1

RIGHT JOIN {some_table} t4
ON t4.{id} = t3.id3    

where
t1.param like '%someshit%'  
 

Заменить {some_table} на нужное имя
Заменить ON t4.{id} = t3.id3 на нужную связь по table и полю
Заменить RIGHT JOIN на LEFT JOIN или INNER JOIN по условию связи tables
Заменить t4.{id} в CASE

Всего записей: 3903 | Зарегистр. 31-03-2002 | Отправлено: 04:07 22-08-2017 | Исправлено: dneprcomp, 06:42 22-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Благодарствую, взял твой пример и нагородил. Работает

Всего записей: 237 | Зарегистр. 06-05-2003 | Отправлено: 11:48 22-08-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2017

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru