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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 25 26 27 28 29 30 31 32 33 34

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

Mic777

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

Цитата:
проблема в том, что иногда запрос может ничего не возвращать, потому что данные из таблицы перестают удовлетворять условиям выборки (в частности по времени).

В том решении, что я предложил запрос вернет всегда минимум 1 запись.
Человек пишет про то, что его это решение не устраивает по причине:

Цитата:
но мониторинг хочет на вход два параметра, так что если на входе будет один Idle = 0, то он все равно словит клина. Мониторинг хочет New = 0, In Progress = 0, если запрос ничего не возвращает.  
При том, что ответ сделан по его же примеру.
 

Цитата:
мониторинг просто запускает запрос [?] (без каких либо параметров) и ждет, что запрос вернет два значения. Если возвращается одно или вообще пусто, то ловит клина.
ну так и возвращаются 2 значения
 

Цитата:
Мониторинг хочет New = 0, In Progress = 0
где в примере автора соответствие этому если там CASE ?
 
Вот в чем проблема ну не понимаю и автор нормально не объясняет.

Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 08:52 20-09-2018 | Исправлено: Mic777, 08:57 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, вот запрос без case - он ничего не возвращает, как правильно заметил Mavrikii
Цитата:
проблема в том, что иногда запрос может ничего не возвращать, потому что данные из таблицы перестают удовлетворять условиям выборки (в частности по времени).
 
В этой ситуации мониторинг хочет получить два значения: 0 и 0.
Таблица таже.

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 10:54 20-09-2018
Mic777

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

Цитата:
без case - он ничего не возвращает, как правильно заметил Mavrikii

case вообще не влияет на то сколько записей возвращается, он влияет на то, как их интерпретировать.
в вашем примере было что есть типа 7 статусов, и 1 - это New, остальные - Progress
ну так и добавьте по аналогии 0 - Idle как я писал выше:
 

Код:
 
select 0 as idstate, 0 as proc_count  
  from dual  
 where (  
 select count(*)
   from proc p  
 where p.idstate in (1, 7)  
   and p.summ > 0  
   and p.crtime between sysdate - 1 / 144 and sysdate
   and rownum <= 1  
 ) = 0  
 union all  
 

 
Что в этом то случае не устраивает я так и не понял
http://sqlfiddle.com/#!4/7127a8/31
 
 
Добавлено:
Mavrikii
 
удобных решений мало  
обычно используют что то вида  
 
Цитата:
If Exists (query)  
       (query)  
Else  
        SELECT 'Value 1', 'Value2'[/q]
 
то что я и предложил сразу, только вместо написания процедуры это все делается в запросе элементарно.

Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 11:37 20-09-2018 | Исправлено: Mic777, 11:46 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, если смиксовать два запроса, то получится такой.
При выполнении выдает ошибку: ORA-01790: expression must have same datatype as corresponding expression.  
К тому же:
Код:
select 0 as idstate, 0 as proc_count  from dual
вернет:
idstate proc_count    
0 0  

А нужно, чтобы возвращал:
idstate proc_count    
New 0    
In Progress 0  

 

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 11:58 20-09-2018 | Исправлено: NiXXX, 11:59 20-09-2018
Mic777

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

Цитата:
если смиксовать два запроса, то получится такой.  
При выполнении выдает ошибку: ORA-01790: expression must have same datatype as corresponding expression.  

Ну так внимательней миксовать надо. Я уже и пример готовый дал
Цитата:
http://sqlfiddle.com/#!4/7127a8/31  

 
Кто же число в результате первого запроса объединяет со строкой  'New' или 'In Progress' во втором.
 
Что касается решения - то это всего лишь пример, что можно использовать union all для достижения вашего требования получить в результате запроса хотя бы одну запись всегда.
А уже как отформатировать чтобы скушал мониторинг это другой вопрос, вам виднее должно быть и тут вообще не вижу проблемы.
 
Добавлено:

Цитата:
А нужно, чтобы возвращал:  

пожалуйста:
http://sqlfiddle.com/#!4/7127a8/42

Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 12:28 20-09-2018 | Исправлено: Mic777, 12:34 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, агонь! Благодарствую!

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 13:02 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, столкнулся с интересным.
Выполняю простой запрос select a.c_id, a.c_number from acc a where a.id = :x and a.num = :y - PL/SQL Developer возвращает одну строку, ок. Вставляю тот же запрос в процедуру и ловлю ошибку "ORA-01422: exact fetch returns more than requested number of rows". Начинаю разбираться - видно, что запрос возвращает строку со значениями и пустую строку. WTF?! Почему?  
Вопрос конечно решается условием rownum = 1, но откуда берется пустая строка?

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 16:01 24-09-2018
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Думаю пиэлю врать нет смысла, так что копай свою процедуру.
Комрады то ее не видят.

Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 09:23 25-09-2018
Kmich



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
просто запрос может вернуть более чем одну строку вот и ругается что в процедуре это не приемлемо, сделать лучше через курсоры.

Всего записей: 188 | Зарегистр. 21-01-2005 | Отправлено: 06:56 28-09-2018
andyzubov

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне кажется курсоры стоит использовать только в крайнем случае, по крайней мере в mssql это не самая быстрая функция

Всего записей: 132 | Зарегистр. 02-04-2015 | Отправлено: 09:16 28-09-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Цитата:
Вопрос конечно решается условием rownum = 1
вопрос решается при помощи GROUP BY и агрегированию по полному списку полей выборки, а при помощи rownum = 1 ты ставишь костыль который в данной ситуации отрабатывает аналогично. Но ситуации бывают разные...

Всего записей: 2473 | Зарегистр. 15-12-2003 | Отправлено: 15:54 28-09-2018
Alexzzy

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

Цитата:
вопрос решается при помощи GROUP BY  

Если агрегирование не нужно, то проще DISTINCT использовать. По быстроте одинаково должно быть.

Всего записей: 1455 | Зарегистр. 10-07-2013 | Отправлено: 16:17 30-09-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
судя по тому что NiXXX предполагает что его запрос должен возвращать именно одну строку - надо именно агрегировать притом не забыть ISNULL для числовых значений...

Всего записей: 2473 | Зарегистр. 15-12-2003 | Отправлено: 19:01 30-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем +100500 в карму за советы!
Разобрался что к чему - разработчик ошибся в одной букве в имени переменной.

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 13:49 10-10-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

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

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

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

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru