Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как вставить несколько значений условие ? / 16 сообщений из 16, страница 1 из 1
05.04.2017, 14:50
    #39433527
Wild-Jack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Всем привет, подскажите !

Столкнулся с такой проблемой, каким образом можно вставить несколько значений в условие ?

У меня есть цикл, который выгружает данные из таблицы TR_SPRAV_FILT по условию из таблицы TEST_tr_transf_back.
Если в таблице TEST_tr_transf_back в поле ADR пусто, то выгружаются все записи из таблицы TR_SPRAV_FILT. Но в некоторых полях стоят значения, например при &nrasx = 9 поле ADR = "B;C", я это значение разбиваю на строки B и C, т.к. в поле t.kod4, таблицы TR_SPRAV_FILT есть значения либо B, либо С и др. Запрос выдаёт ошибку ORA-01427 single-row subquery returns more than one row

Подскажите пожалуйста каким способом можно вернуть условием более одной строки ?

Заранее благодарю !

Код: plsql
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.
35.
36.
37.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 IN 
            (CASE WHEN 
                 (SELECT 
                         /*t2.*,*/ MAX(column_value) ADR
                  FROM 
                         TEST_tr_transf_back t2
                       , TABLE(SELECT cast(collect(regexp_substr(ADR, '[^;]+', 1, level)) as sys.odcivarchar2list) 
                               FROM dual connect by level <= regexp_count(ADR, ';') + 1
                               )
                  WHERE 
                         t2.DTDATE = '31.12.2016'
                     AND t2.nfil = 'all'
                     AND t2.nrasx = &nrasx ---
                  ) IS NULL 
             THEN t.kod4 
             ELSE 
                 (SELECT 
                         column_value ADR
                  FROM 
                         TEST_tr_transf_back t2
                       , TABLE(SELECT cast(collect(regexp_substr(ADR, '[^;]+', 1, level)) as sys.odcivarchar2list) 
                               FROM dual connect by level <= regexp_count(ADR, ';') + 1
                               )
                  WHERE 
                         t2.DTDATE = '31.12.2016'
                     AND t2.nfil = 'all'
                     AND t2.nrasx = &nrasx ---
                  )
             END)
...
Рейтинг: 0 / 0
05.04.2017, 15:09
    #39433542
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-Jack,

хорошо б рабочий запрос в тестовый переделать с with ... select ... from dual union all select ... from dual и т.д.
проблема-то не сложная вроде, но проверить надо
...
Рейтинг: 0 / 0
05.04.2017, 15:31
    #39433563
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-Jack,

Код: plsql
1.
2.
3.
  ELSE 
                 (SELECT 
                         LISTAGG(column_value ....  ADR




.....
stax
...
Рейтинг: 0 / 0
05.04.2017, 15:31
    #39433564
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Vladimir Filin,

Какое отношение у соединения в подзапросе? 1 к 1, 1 к n ?

в вырожденном случае instr(t.kod4,nvl(t2.adr,t.kod4),1) != 0
...
Рейтинг: 0 / 0
05.04.2017, 15:32
    #39433567
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Станислав, предлагаешь обратно свернуть заботливо развёрнутое?
...
Рейтинг: 0 / 0
05.04.2017, 15:36
    #39433573
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-Jack,

Я не очень понял код, особенно без значений, но думаю надо исправлять так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 IN 
            (SELECT distinct nvl(regexp_substr(ADR, '[^;]+', 1, level), t.kod4)
               FROM TEST_tr_transf_back t2 
             WHERE t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx ---
             connect by level <= regexp_count(ADR, ';') + 1
)
...
Рейтинг: 0 / 0
05.04.2017, 15:42
    #39433578
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
MaximaXXL,
Код: plsql
1.
2.
with TEST_tr_transf_back  as (select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'A;;C;D' adr from dual),
      TR_SPRAV_FILT as (select 'B' kod4, date '2016-12-31' dtdate from dual)
...
Рейтинг: 0 / 0
05.04.2017, 15:46
    #39433584
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
env,

по твоему примеру - вернет

а не очень понял, это может ли быть такой например случай
Код: plsql
1.
2.
3.
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'A;;C;D' adr from dual union all
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, null     adr from dual union all
select date '2016-12-31' dtdate, 'all' nfil, 9 nrasx, 'K'      adr from dual
...
Рейтинг: 0 / 0
05.04.2017, 15:50
    #39433590
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
env,

хотя надо ли рассматривать 'A;;C;D' как набор
A
null
C
D

или как набор
A
C
D

и бывают ли такие случаи
...
Рейтинг: 0 / 0
05.04.2017, 15:52
    #39433592
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-Jack,

Может так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 is not null
   And exists 
            (SELECT *
               FROM TEST_tr_transf_back t2 
             WHERE t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx ---
              and ';'||nvl(ADR,t.kod4)||';' like '%;'|| t.kod4||';%'
)
...
Рейтинг: 0 / 0
05.04.2017, 15:57
    #39433596
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-Jack,

Точнее так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
          t.*
FROM 
          TR_SPRAV_FILT t

WHERE 
          t.dtdate = '31.12.2016' --
       
   AND t.kod4 is not null
   And exists 
            (SELECT *
               FROM dual left outer join TEST_tr_transf_back t2 
             on( t2.DTDATE = '31.12.2016'
                 AND t2.nfil = 'all'
                 AND t2.nrasx = &nrasx)
              where ';'||nvl(ADR,t.kod4)||';' like '%;'|| t.kod4||';%'
)
...
Рейтинг: 0 / 0
05.04.2017, 16:17
    #39433619
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
envСтанислав, предлагаешь обратно свернуть заботливо развёрнутое?
поборем ж ORA-01427 single-row subquery returns more than one row

имхо там слетает

.....
stax
...
Рейтинг: 0 / 0
05.04.2017, 16:57
    #39433651
Wild-Jack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Всем спасибо за ответы, но поясню по требуемой задаче.

По таблице TEST_tr_transf_back я строю цикл
Примерные значения

Код: plsql
1.
2.
3.
4.
5.
select 'all' nfil, 1 nrasx, NULL  adr, TO_DATE('2016-12-31') dtdate from dual
 union all 
select 'all' nfil, 7 nrasx, 'C'   adr, TO_DATE('2016-12-31') dtdate from dual
 union all
select 'all' nfil, 9 nrasx, 'C;D' adr, TO_DATE('2016-12-31') dtdate from dual



т.е. циклом я выгружаю данные из таблицы TR_SPRAV_FILT
При nrasx = 1 выгружаются все данные из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN (t.kod4)

)
При nrasx = 7 выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C')

)
А вот при nrasx = 9 у меня загвоздка, т.к. выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C','B')

)
...
Рейтинг: 0 / 0
05.04.2017, 19:26
    #39433748
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
Wild-JackВсем спасибо за ответы, но поясню по требуемой задаче.

По таблице TEST_tr_transf_back я строю цикл
Примерные значения

Код: plsql
1.
2.
3.
4.
5.
select 'all' nfil, 1 nrasx, NULL  adr, TO_DATE('2016-12-31') dtdate from dual
 union all 
select 'all' nfil, 7 nrasx, 'C'   adr, TO_DATE('2016-12-31') dtdate from dual
 union all
select 'all' nfil, 9 nrasx, 'C;D' adr, TO_DATE('2016-12-31') dtdate from dual



т.е. циклом я выгружаю данные из таблицы TR_SPRAV_FILT
При nrasx = 1 выгружаются все данные из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN (t.kod4)

)
При nrasx = 7 выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C')

)
А вот при nrasx = 9 у меня загвоздка, т.к. выгружаются только записи у которых t.kod4 = 'C' из таблицы TR_SPRAV_FILT (по условию
Код: plsql
1.
t.kod4 IN ('C','B')

)


Код: plsql
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> ed
Wrote file afiedt.buf

  1  with t1 as
  2  (select 'Ш' kod4, 'Stax' n from dual union all
  3   select 'C' kod4, 'Stanislav' n from dual union all
  4   select 'D' kod4, 'Станіслав' n from dual )
  5  ,t2 as (
  6  select 'all' nfil, 1 nrasx, NULL  adr, DATE '2016-12-31' dtdate from dual
  7   union all
  8  select 'all' nfil, 7 nrasx, 'C'   adr, DATE '2016-12-31' dtdate from dual
  9   union all
 10  select 'all' nfil, 9 nrasx, 'C;D' adr, DATE '2016-12-31' dtdate from dual
 11  )
 12  select * from t1
 13  where kod4 in (
 14    select t.column_value
 15    from t2,TABLE(SELECT cast(collect(regexp_substr(nvl(ADR,t1.kod4), '[^;]+', 1, level)) as sys.odcivarchar2list)
 16            FROM dual connect by level <= regexp_count(ADR, ';') + 1) t
 17    where nrasx=&nrasx
 18* )
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=7

K N
- ---------
C Stanislav

SQL> def nrasx=9
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=9

K N
- ---------
D Станіслав
C Stanislav

SQL> def nrasx=1
SQL> /
old  17:   where nrasx=&nrasx
new  17:   where nrasx=1

K N
- ---------
Ш Stax
C Stanislav
D Станіслав




.....
stax
...
Рейтинг: 0 / 0
06.04.2017, 07:09
    #39433877
Wild-Jack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
stax.., спасибо Вам большое !
Очень выручили !
Всё гениальное просто...
...
Рейтинг: 0 / 0
06.04.2017, 14:00
    #39434166
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как вставить несколько значений условие ?
stax..,
зачем разворачивать ? уже давали совет 20369710 для твоего примера
Код: plsql
1.
2.
select * from t1,t2 where  instr(nvl(t2.adr,t1.kod4),t1.kod4 )>0
   and t2.nrasx=1
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как вставить несколько значений условие ? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]