Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Запрос из таблицы по списку значений...  [new]
Е.
Member

Откуда: Владивосток
Сообщений: 38
Всем привет!
Подскажите как построить запрос из таблицы по списку значений, причем если значения в таблице нет, то в результате должна быть строка с 0 -. Например

select count(t.id),t.id from test t where t.id in ('1','3','5') group by t.id

результат (какой хотелось бы):
1 1
0 3
1 5

Поскольку строки с id=3 в таблице нет.

Думаю должно быть просто, но сам не могу дойти ...
4 май 07, 05:21    [4097412]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
NewMad
Guest
with t1 as (
          select 1 id from dual
union all select 5 id from dual
union all select 5 id from dual
),
/*список*/ t2 as ( 
          select 1 id from dual
union all select 3 id from dual
union all select 5 id from dual
)
select t2.id, count(t1.id) from t1, t2
where t1.id(+) = t2.id
group by t2.id
order by 1
4 май 07, 06:11    [4097430]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Е.
Member

Откуда: Владивосток
Сообщений: 38
С таблицами, я и сам догадался как сделать, вопрос в том как строку значений привести к табличному виду.
Эта строка поступает с терминала, и каждый раз отличается. Запихивать ее в таблицу, можно конечно, но не хотелось бы...
4 май 07, 07:11    [4097472]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Е.
С таблицами, я и сам догадался как сделать, вопрос в том как строку значений привести к табличному виду.
Эта строка поступает с терминала, и каждый раз отличается. Запихивать ее в таблицу, можно конечно, но не хотелось бы...
В каком виде поступает строка?
Если как одно значение вида: '1,2,3,4,5', то никто тебе не мешает распарсить это значение в таблицу-столбец.
4 май 07, 07:49    [4097514]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Бабичев Сергей
Если как одно значение вида: '1,2,3,4,5', то никто тебе не мешает распарсить это значение в таблицу-столбец.


Примерно вот так:

SQL> var str varchar2(10);
SQL> exec :str := '1,2,3,10';

Процедура PL/SQL успешно завершена.

SQL> select rownum, new_str, :str
  2   from (
  3  select substr( my_str,
  4                 instr(my_str,',',1, rownum) + 1,
  5                 instr(my_str,',',1, rownum + 1) -  instr(my_str,',',1, rownum) - 1
  6               ) as new_str
  7    from (select ','||ltrim(rtrim(:str,','),',')||',' as my_str from dual)
  8   connect by level <= length(ltrim(rtrim(my_str,','),',')) - length(replace(:str,',')) + 1);

ROWNUM   NEW_STR     :STR  
------   -------   --------
     1         1   1,2,3,10
     2         2   1,2,3,10
     3         3   1,2,3,10
     4        10   1,2,3,10

SQL> exit
4 май 07, 08:04    [4097532]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Е.
Member

Откуда: Владивосток
Сообщений: 38
Входная строка это именно строка, типа '1,2,4,6,7,3'
Можно конечно закинуть это во временную таблицу, а потом с этим работать.
Только работа планируется как минимум на двух станциях и данные с двух терминалов, прийдется как-то привязывать временную таблицу к сессии и с ней работать, а хотелось, то счастья ;)
Как будто-бы это строка является таблицей, и я проверяю все ли значения есть в другой (реальной) таблице.
4 май 07, 08:07    [4097538]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Е.
Входная строка это именно строка, типа '1,2,4,6,7,3'
Можно конечно закинуть это во временную таблицу, а потом с этим работать.
Только работа планируется как минимум на двух станциях и данные с двух терминалов, прийдется как-то привязывать временную таблицу к сессии и с ней работать, а хотелось, то счастья ;)
Как будто-бы это строка является таблицей, и я проверяю все ли значения есть в другой (реальной) таблице.
Я же тебе показал решение!
Там значение тоже как раз в виде строки передается. Затем в запросе эта строка рскладывается по разделителю на строки. В результате формируется результирующий набор данных, содержащий в себе столько строк, сколько значений передано в строке.
Фактически на выходе имеем таблицу, коотрую можно заджойнить с основной таблицей.
4 май 07, 08:11    [4097544]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Е.
Member

Откуда: Владивосток
Сообщений: 38
ОК!
Спасибо, оно самое привалило :)
Буду пробовать в реальном приложении.
4 май 07, 08:18    [4097551]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из таблицы по списку значений...  [new]
Bely
Member

Откуда: Москва
Сообщений: 1903
Е.
Только работа планируется как минимум на двух станциях и данные с двух терминалов, прийдется как-то привязывать временную таблицу к сессии и с ней работать, а хотелось, то счастья ;
И еще - надо почитать про Временные таблицы в Oracle - судя по всему ты про них не знаешь.
4 май 07, 13:06    [4099409]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить