powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно оптимизировать дублирование запроса?
11 сообщений из 11, страница 1 из 1
Можно оптимизировать дублирование запроса?
    #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
Можно оптимизировать дублирование запроса?
    #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
Можно оптимизировать дублирование запроса?
    #39759322
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,
нет, мне нужно отличать отсутствие записей в таблице (значение 1) и отсутствие записей удовлетворяющих условию (значение 0), само условие до лампочки, это только пример.
...
Рейтинг: 0 / 0
Можно оптимизировать дублирование запроса?
    #39759337
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasaэто только примерна выходе у тебя только 0 и 1. Отрицание от "само условие до лампочки", с учетом nullности, удовлетворяет постановке.
...
Рейтинг: 0 / 0
Можно оптимизировать дублирование запроса?
    #39759344
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

OK. реальное условие
t.type is null
...
Рейтинг: 0 / 0
Можно оптимизировать дублирование запроса?
    #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
Можно оптимизировать дублирование запроса?
    #39759387
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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

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

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


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