Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Друзья, помогите решить задачу.
Делаю динамический запрос, как вычислить дату не ф-цией типа max(dt), а отработать этот же max(dt) перед отработкой самого запроса и использовать уже найденное ранее значение.
DECLARE
dt date := (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc);
BEGIN
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt =:dt
END;

Буду любезен за ссылочку и благодарен за ответы!
4 мар 15, 12:55    [17341822]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
fedoamx,

1 .Нужно всё одним запросом.
2. Вместо переменной dt используй подзапрос.
3. Для максимальной даты использовать
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions056.htm
4. sql-ex.ru в помощь в освоение sql.
4 мар 15, 13:10    [17341879]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Узер гуи де
Guest
fedoamx
Буду любезен за ссылочку
docs.oracle.com. От концепций и докуда хватит желания.
4 мар 15, 13:10    [17341881]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
 (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)

Результат получится неправильным. Сперва where, затем select, затем сортировка.
4 мар 15, 13:11    [17341885]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89,
Подзапрос долго отрабатывает
4 мар 15, 13:34    [17341992]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
fedoamx,

За редким исключением вместо 2 запросов всегда нужно писать один. Как минимум результат получится согласованным.
4 мар 15, 13:46    [17342051]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
fedoamx
Den89,
Подзапрос долго отрабатывает

2 отдельных запроса все равно быстрее не заработают.
4 мар 15, 13:48    [17342062]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89,
Для сравнения:
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt =(select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)

Отрабатывает 9 минут ( с max() такая же беда)

SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt = '01.01.2015'
     Order by a.dt desc)

отрабатывает 1 минуту

Я склоняюсь к запросу присвоению даты переменному значению.
4 мар 15, 14:12    [17342249]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
(select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)

Это не правильный запрос. Он не вернет максимальную дату. Почему - написал выше.

Очень бы хотелось посмотреть на план 1 запроса.
4 мар 15, 14:29    [17342364]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89
 (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)

Результат получится неправильным. Сперва where, затем select, затем сортировка.


Но результат то правильный. А схема where/select/order у меня в голове не укладывается :(
4 мар 15, 14:33    [17342389]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
Den89
Member

Откуда: Санкт-Петербург
Сообщений: 351
Правильный результат никто не гарантирует, в любой момент он может измениться на неправильный.

Схема такая: сперва выполняется where. Из всей таблицы ты выдергиваешь одну строку. Дальше выполняется select и только потом сортировка. Т.е. сортируешь одну запись, а не сперва сортируешь и только потом берёшь максимальную.
4 мар 15, 14:39    [17342417]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89
Правильный результат никто не гарантирует, в любой момент он может измениться на неправильный.

Схема такая: сперва выполняется where. Из всей таблицы ты выдергиваешь одну строку. Дальше выполняется select и только потом сортировка. Т.е. сортируешь одну запись, а не сперва сортируешь и только потом берёшь максимальную.


Ден, очень тяжело написал, можешь написать по простому или сам скрипт, до меня видимо туго доходит.
Я не понимаю как можно отсортировать одну строку

В моем скрипте я просто беру первую строку с сортировкой от максимального значения к минимальному.
4 мар 15, 14:46    [17342464]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
123йй
Member

Откуда:
Сообщений: 1635
fedoamx
В моем скрипте я просто беру первую попавшуюся строку с сортировкой ее от максимального значения к минимальному.
4 мар 15, 14:49    [17342479]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89
[src oracle]
Очень бы хотелось посмотреть на план 1 запроса.

План:
1. Присваиваем переменной максимальную дату
2. Используем ее в select
4 мар 15, 14:50    [17342482]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
123йй
fedoamx
В моем скрипте я просто беру первую попавшуюся строку с сортировкой ее от максимального значения к минимальному.


вы про это?:
select b.dt 
from 
(select a.dt as dt
       from dwh.max_dates a 
     Order by a.dt desc) b
Where rownum =1 
4 мар 15, 14:58    [17342524]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
Den89
fedoamx
Den89,
Подзапрос долго отрабатывает

2 отдельных запроса все равно быстрее не заработают.


Так все-таки, declare нельзя перед select использовать или неправильно так делать?
4 мар 15, 15:00    [17342545]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
fedoamx
Den89
пропущено...

2 отдельных запроса все равно быстрее не заработают.


Так все-таки, declare нельзя перед select использовать или неправильно так делать?


Зависит от того, что дальше с результатом делать будешь
4 мар 15, 15:05    [17342580]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
fedoamx
Member

Откуда: Москва
Сообщений: 170
__vvp_
fedoamx
пропущено...
Так все-таки, declare нельзя перед select использовать или неправильно так делать?

Зависит от того, что дальше с результатом делать будешь


Хотел так использовать

DECLARE
dt date := (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc);

BEGIN
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt =:dt
END;
4 мар 15, 15:10    [17342615]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
fedoamx
__vvp_
пропущено...

Зависит от того, что дальше с результатом делать будешь


Хотел так использовать

DECLARE
dt date := (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc);

BEGIN
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt =:dt
END;


Так нельзя использовать.
Даже учитывая то, что подзапрос в declare недопустим, а в подзапросе как уже отмечали, не максимальная дата выбирается, лишняя запятая в select и используется переменная привязки ни селу ни к городу.
4 мар 15, 15:20    [17342670]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
AlexGubin
Member

Откуда:
Сообщений: 58
Попробуй вот так

SELECT dt MN
     , juridic_person_name_s CLN_NAME
  FROM dwh.det_juridic_person
 WHERE id_system=66666
   AND dt = (SELECT MAX(a.dt) FROM dwh.max_dates a)
/


или

DECLARE
v_dt date;
BEGIN
select max(a.dt)
  into v_dt
  from dwh.max_dates a;

SELECT dt MN,       
       juridic_person_name_s CLN_NAME
  INTO ----?????????
  FROM dwh.det_juridic_person djp 
 WHERE djp.id_system=66666
   AND djp.dt = v_dt;
END;
/


Но во втором случае, нужно результат запроса куда то записывать.
4 мар 15, 15:50    [17342823]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
stax..
Guest
fedoamx,

где Вы собираетесь выполнять селекты?
если в sql*pluse то
SQL> set lines 200
SQL> var max_dt varchar2(10)
SQL> exec select to_char(max(HIREDATE),'dd.mm.yyyy') into :max_dt from emp;

PL/SQL procedure successfully completed.

SQL> select * from emp where HIREDATE=to_date(:max_dt,'dd.mm.yyyy');

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20


зи
почемуто в плюсе нет типа date

......
stax
4 мар 15, 16:14    [17342976]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
fedoamx
Друзья, помогите решить задачу.
Делаю динамический запрос, как вычислить дату не ф-цией типа max(dt), а отработать этот же max(dt) перед отработкой самого запроса и использовать уже найденное ранее значение.
DECLARE
dt date := (select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc);
BEGIN
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from 
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt =:dt
END;

Буду любезен за ссылочку и благодарен за ответы!


with z as
(select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from z,
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt = z.dt
4 мар 15, 16:24    [17343034]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
stax..
Guest
ArtNick
with z as
(select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from z,
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt = z.dt

(select a.dt as dt
       from dwh.max_dates a
     where 
       rownum =1 
     Order by a.dt desc)


Так нельзя использовать....
17342670



......
stax
4 мар 15, 16:37    [17343116]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
stax..,
with z as
(select max(a.dt) as dt
       from dwh.max_dates a)
SELECT djp.dt MN,       
djp.juridic_person_name_s CLN_NAME,
from z,
  dwh.det_juridic_person djp 
where 
  (djp.id_system=66666) 
and 
  djp .dt = z.dt

так можно?
4 мар 15, 16:43    [17343150]     Ответить | Цитировать Сообщить модератору
 Re: расчет переменной перед select.синтаксис  [new]
123йй
Member

Откуда:
Сообщений: 1635
stax..
зи
почемуто в плюсе нет типа date

......
stax
потому что его нет в доке :)
4 мар 15, 16:52    [17343209]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить