powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос
16 сообщений из 16, страница 1 из 1
Запрос
    #39687490
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,

как бы вы переписали следующие условия:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
....
  from   test tt
where   (tt.a in (select t.id1 from tmp t where t.id = <i>+1)
                or not exists(select t.b from tmp t where t.id = <i>+1))
   and   (tt.b in (select t.id1 from tmp t where t.id = <i>+2)
                or not exists(select t.id1 from tmp t where t.id = <i>+2))
   and   (tt.c in (select t.id1 from tmp t where t.id = <i>+3)
                or not exists(select t.id1 from tmp t where t.id = <i>+3))
   and   (tt.d in (select t.id1 from tmp t where t.id = <i>+4)
                or not exists(select t.id1 from tmp t where t.id = <i>+4))
   and   (tt.f in (select t.id1 from tmp t where t.id = <i>+5)
                or not exists(select t.id1 from tmp t where t.id = <i>+5))



спс
...
Рейтинг: 0 / 0
Запрос
    #39687557
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogПривет,

как бы вы переписали следующие условия:

Код: plsql
1.
2.
3.
4.
....
  from   test tt
where   (tt.a in (select t.id1 from tmp t where t.id = <i>+1)
                or not exists(select t.b from tmp t where t.id = <i>+1))


Так, чтобы не было синтаксических ошибок,
в том числе вызванных неадекватным использованием символов '>' и '<'.
...
Рейтинг: 0 / 0
Запрос
    #39687567
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with q(id, id1) as (select 1, 111 from dual union all
select 3, 120 from dual union all
select 4, 121 from dual union all
select 6, 122 from dual union all
select 7, 122 from dual union all
select 9, 122 from dual)

, w(i) as (select 1 from dual)

, e(a,b,c,d,f) as (select 111, 120, 121, 6, 123 from dual union all
select 3, 120, 121, 6, 122 from dual)

select e.* from e
  join (select max(case when q.id = i+1 then q.id1 else null end) as a
             , max(case when q.id = i+2 then q.id1 else null end) as b
             , max(case when q.id = i+3 then q.id1 else null end) as c
             , max(case when q.id = i+4 then q.id1 else null end) as d
             , max(case when q.id = i+5 then q.id1 else null end) as f
          from q join w on q.id >= i+1 and q.id <= i+5) q on e.a = nvl(q.a,e.a)
                                                         and e.b = nvl(q.b,e.b)
                                                         and e.c = nvl(q.c,e.c)
                                                         and e.d = nvl(q.d,e.d)
                                                         and e.f = nvl(q.f,e.f)
...
Рейтинг: 0 / 0
Запрос
    #39687623
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with q(id, id1) as (select 1, 111 from dual union all
select 3, 120 from dual union all
select 4, 121 from dual union all
select 6, 122 from dual union all
select 7, 122 from dual union all
select 9, 122 from dual)

, w(i) as (select 1 from dual)

, e(a,b,c,d,f) as (select 111, 120, 121, 6, 123 from dual union all
select 3, 120, 121, 6, 122 from dual)

select e.* from e
  join (select max(case when q.id = i+1 then q.id1 else null end) as a
             , max(case when q.id = i+2 then q.id1 else null end) as b
             , max(case when q.id = i+3 then q.id1 else null end) as c
             , max(case when q.id = i+4 then q.id1 else null end) as d
             , max(case when q.id = i+5 then q.id1 else null end) as f
          from q join w on q.id >= i+1 and q.id <= i+5) q on e.a = nvl(q.a,e.a)
                                                         and e.b = nvl(q.b,e.b)
                                                         and e.c = nvl(q.c,e.c)
                                                         and e.d = nvl(q.d,e.d)
                                                         and e.f = nvl(q.f,e.f)



спасибо. выглядит более удобочитаемым)
...
Рейтинг: 0 / 0
Запрос
    #39687642
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  1  with test as(select 1 a,2 b,3 c,4 d, 5 f from dual)
  2  ,tmp as (select 0 id, 6 id1,0 b from dual)
  3  select *
  4    from   test tt
  5  where   (tt.a in (select t.id1 from tmp t where t.id = 100+1)
  6                  or not exists(select t.b from tmp t where t.id = 100+1))
  7     and   (tt.b in (select t.id1 from tmp t where t.id = 100+2)
  8                  or not exists(select t.id1 from tmp t where t.id = 100+2))
  9     and   (tt.c in (select t.id1 from tmp t where t.id = 100+3)
 10                  or not exists(select t.id1 from tmp t where t.id = 100+3))
 11     and   (tt.d in (select t.id1 from tmp t where t.id = 100+4)
 12                  or not exists(select t.id1 from tmp t where t.id = 100+4))
 13     and   (tt.f in (select t.id1 from tmp t where t.id = 100+5)
 14*                 or not exists(select t.id1 from tmp t where t.id = 100+5))
SQL> /

         A          B          C          D          F
---------- ---------- ---------- ---------- ----------
         1          2          3          4          5



or not exists учтено?

.....
stax
...
Рейтинг: 0 / 0
Запрос
    #39687648
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxDshedoo,

or not exists учтено?

.....
stax
учтено, max даст пустую строку

....
stax
...
Рейтинг: 0 / 0
Запрос
    #39687656
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сдается мне, что вариант от Dshedoo не сработает в случае когда количество записей возвращаемых для запросов
Код: plsql
1.
select t.id1 from tmp t where t.id = <i>+1

и
Код: plsql
1.
select t.id1 from tmp t where t.id = <i>+2

различается...или даже если количество записей > 1.
...
Рейтинг: 0 / 0
Запрос
    #39687659
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
например, запрос
Код: 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.
with q(id, id1) as (select 1, 111 from dual union all
select 3, 120 from dual union all
select 3, 127 from dual union all
select 4, 121 from dual union all
select 6, 122 from dual union all
select 7, 122 from dual union all
select 9, 122 from dual)

, w(i) as (select 1 from dual)

, e(a,b,c,d,f) as (select 111, 120, 121, 6, 123 from dual union all
select 3, 120, 121, 6, 122 from dual)

select e.* from e
  join (select max(case when q.id = i+1 then q.id1 else null end) as a
             , max(case when q.id = i+2 then q.id1 else null end) as b
             , max(case when q.id = i+3 then q.id1 else null end) as c
             , max(case when q.id = i+4 then q.id1 else null end) as d
             , max(case when q.id = i+5 then q.id1 else null end) as f
          from q join w on q.id >= i+1 and q.id <= i+5) q on e.a = nvl(q.a,e.a)
                                                         and e.b = nvl(q.b,e.b)
                                                         and e.c = nvl(q.c,e.c)
                                                         and e.d = nvl(q.d,e.d)
                                                         and e.f = nvl(q.f,e.f)


вообще ничего не вернет.
...
Рейтинг: 0 / 0
Запрос
    #39687663
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog,
імхо t.id уникально

.....
stax
...
Рейтинг: 0 / 0
Запрос
    #39687665
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxcobalt_frog,
імхо t.id уникально

.....
stax

в том то и дело, что нет(
...
Рейтинг: 0 / 0
Запрос
    #39687834
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog,

a,b,c,d,f,id числа?

....
stax
...
Рейтинг: 0 / 0
Запрос
    #39687836
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogStaxcobalt_frog,
імхо t.id уникально

.....
stax

в том то и дело, что нет(

В таком случае я бы предпочёл изначальный вариант, но есть ещё такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with q(id, id1) as (select 1, 111 from dual union all
select 3, 120 from dual union all
select 3, 127 from dual union all
select 4, 121 from dual union all
select 6, 122 from dual union all
select 7, 122 from dual union all
select 9, 122 from dual)

, w(i) as (select 1 from dual)

, e(a,b,c,d,f) as (select 111, 120, 121, 6, 123 from dual union all
select 3, 127, 121, 6, 122 from dual union all
select 3, 120, 121, 6, 122 from dual)

select * from e
where e.a in (select nvl(q.id1,e.a) from w left join q on q.id = w.i + 1)
  and e.b in (select nvl(q.id1,e.b) from w left join q on q.id = w.i + 2)
  and e.c in (select nvl(q.id1,e.c) from w left join q on q.id = w.i + 3)
  and e.d in (select nvl(q.id1,e.d) from w left join q on q.id = w.i + 4)
  and e.f in (select nvl(q.id1,e.f) from w left join q on q.id = w.i + 5)
...
Рейтинг: 0 / 0
Запрос
    #39687839
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxcobalt_frog,

a,b,c,d,f,id числа?

....
stax

часть числа, часть нет.
...
Рейтинг: 0 / 0
Запрос
    #39687840
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoocobalt_frogпропущено...


в том то и дело, что нет(

В таком случае я бы предпочёл изначальный вариант, но есть ещё такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with q(id, id1) as (select 1, 111 from dual union all
select 3, 120 from dual union all
select 3, 127 from dual union all
select 4, 121 from dual union all
select 6, 122 from dual union all
select 7, 122 from dual union all
select 9, 122 from dual)

, w(i) as (select 1 from dual)

, e(a,b,c,d,f) as (select 111, 120, 121, 6, 123 from dual union all
select 3, 127, 121, 6, 122 from dual union all
select 3, 120, 121, 6, 122 from dual)

select * from e
where e.a in (select nvl(q.id1,e.a) from w left join q on q.id = w.i + 1)
  and e.b in (select nvl(q.id1,e.b) from w left join q on q.id = w.i + 2)
  and e.c in (select nvl(q.id1,e.c) from w left join q on q.id = w.i + 3)
  and e.d in (select nvl(q.id1,e.d) from w left join q on q.id = w.i + 4)
  and e.f in (select nvl(q.id1,e.f) from w left join q on q.id = w.i + 5)



спасибо.
...
Рейтинг: 0 / 0
Запрос
    #39687860
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
5 = (select max(case when r.l=1 and lnnvl(q.id1<>e.a) then 1 else 0 end) +
            max(case when r.l=2 and lnnvl(q.id1<>e.b) then 1 else 0 end) +
            max(case when r.l=3 and lnnvl(q.id1<>e.c) then 1 else 0 end) +
            max(case when r.l=4 and lnnvl(q.id1<>e.d) then 1 else 0 end) +
            max(case when r.l=5 and lnnvl(q.id1<>e.f) then 1 else 0 end)
     from q right join (select level l from dual connect by level<=5) r on q.id = 1 + r.l)
...
Рейтинг: 0 / 0
Запрос
    #39687907
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

красиво

.....
stax
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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