Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос / 16 сообщений из 16, страница 1 из 1
14.08.2018, 14:09
    #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
14.08.2018, 15:36
    #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
14.08.2018, 15:46
    #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
14.08.2018, 16:40
    #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
14.08.2018, 16:59
    #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
14.08.2018, 17:04
    #39687648
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
StaxDshedoo,

or not exists учтено?

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

....
stax
...
Рейтинг: 0 / 0
14.08.2018, 17:13
    #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
14.08.2018, 17:16
    #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
14.08.2018, 17:19
    #39687663
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
cobalt_frog,
імхо t.id уникально

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

.....
stax

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

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

....
stax
...
Рейтинг: 0 / 0
15.08.2018, 08:51
    #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
15.08.2018, 09:00
    #39687839
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Staxcobalt_frog,

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

....
stax

часть числа, часть нет.
...
Рейтинг: 0 / 0
15.08.2018, 09:01
    #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
15.08.2018, 09:36
    #39687860
-2-
-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
15.08.2018, 10:49
    #39687907
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
-2-,

красиво

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


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