Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно оптимизировать дублирование запроса? / 11 сообщений из 11, страница 1 из 1
14.01.2019, 13:53
    #39759297
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
Добрый день!
Нужно отличить отсутствие записей в таблице (значение 1) и отсутствие записей удовлетворяющих условию (значение 0).
Сделал так (упрощенный пример):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
case when exists(select 1 from table t where t.id = 10)
       then case when exists(select 1 from table t where t.id = 10 and t.type = 1)
                 then 1
                 else 0
                 end
       else 1
end t

возможно сделать одним запросом?
...
Рейтинг: 0 / 0
14.01.2019, 14:20
    #39759317
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
am_sasa,

а логика не кривая ?
case when exists(select 1 from t where t.id = 10 and t.type ! = 1) then 0 else 1 end
...
Рейтинг: 0 / 0
14.01.2019, 14:25
    #39759322
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
123йй,
нет, мне нужно отличать отсутствие записей в таблице (значение 1) и отсутствие записей удовлетворяющих условию (значение 0), само условие до лампочки, это только пример.
...
Рейтинг: 0 / 0
14.01.2019, 14:36
    #39759337
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
am_sasaэто только примерна выходе у тебя только 0 и 1. Отрицание от "само условие до лампочки", с учетом nullности, удовлетворяет постановке.
...
Рейтинг: 0 / 0
14.01.2019, 14:46
    #39759344
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
-2-,

OK. реальное условие
t.type is null
...
Рейтинг: 0 / 0
14.01.2019, 15:22
    #39759364
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
am_sasa,

id=10 -условие которое проверяем

Код: 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.
SQL> select id from t;
SQL> set numformat ''
SQL> /

        ID
----------
         1
         2
         3


SQL> ed
Wrote file afiedt.buf

  1* select nvl(max(case when id=10 then 1 else 0 end),1) f from t
SQL> /

         F
----------
         0

SQL> insert into t(id) values(10);

1 row created.

SQL> select nvl(max(case when id=10 then 1 else 0 end),1) f from t
  2  /

         F
----------
         1

SQL> delete t;

4 rows deleted.

SQL> select nvl(max(case when id=10 then 1 else 0 end),1) f from t
  2  /

         F
----------
         1

SQL> rollback;

Rollback complete.

SQL>



.....
stax
...
Рейтинг: 0 / 0
14.01.2019, 15:53
    #39759387
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
Stax,

Спасибо, попробую!!!
...
Рейтинг: 0 / 0
14.01.2019, 16:24
    #39759411
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
Stax,
Супер! То что надо!!!
Спасибо!!!
...
Рейтинг: 0 / 0
14.01.2019, 16:48
    #39759436
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
am_sasaStax,
Супер! То что надо!!!
Спасибо!!!

имхо
c exists будет побыстрее, отвечал больше на "возможно сделать одним запросом?"

.....
stax
...
Рейтинг: 0 / 0
14.01.2019, 16:54
    #39759440
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
Stax,

А теперь представь в таблице миллионы записей c id=10

Код: plsql
1.
select count(*) f from t where id=10 and rownum = 1



Например:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> select  count(*)
  2    from  emp
  3    where job = 'CLERK'
  4      and rownum = 1
  5  /

  COUNT(*)
----------
         1

SQL> select  count(*)
  2    from  emp
  3    where job = 'JANITOR'
  4      and rownum = 1
  5  /

  COUNT(*)
----------
         0

SQL> 



SY.
...
Рейтинг: 0 / 0
14.01.2019, 17:34
    #39759461
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно оптимизировать дублирование запроса?
SY,

я ж написал, что с exist будет побыстрее

если табличка маленькая (скажем 1000 строк) то может и прокатить

не знаю, так есть дублирование или нет?
Код: 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.
SQL> select max(cc) f from (
  2   select 1 cc from dual where exists (select 1 from t where id=10)
  3   union all
  4   select nvl(min(0),1) from t where rownum<2)
  5  /

         F
----------
         0

SQL> insert into t(id) values(10);

1 row created.

SQL> /

1 row created.

SQL> select max(cc) f from (
  2   select 1 cc from dual where exists (select 1 from t where id=10)
  3   union all
  4   select nvl(min(0),1) from t where rownum<2)
  5  /

         F
----------
         1

SQL> delete t;

5 rows deleted.

SQL> select max(cc) f from (
  2   select 1 cc from dual where exists (select 1 from t where id=10)
  3   union all
  4   select nvl(min(0),1) from t where rownum<2)
  5  /

         F
----------
         1

SQL> rollback;



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


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