powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите переписать запрос в конструкцию.
13 сообщений из 13, страница 1 из 1
Помогите переписать запрос в конструкцию.
    #39328771
graph91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане!
Прошу не судить строго, если задаю глупые вопросы, но я начинающий, поэтому у меня их много и я много чего не умею.
Надеюсь на Вашу помощь.

Есть запрос:
SELECT a.C_1, b.C_10
FROM a, b
WHERE a.C_1 like '406%'
and (a.C_2=b.C_2)
AND (b.C_1 >= TO_DATE('30.06.2016', 'DD/MM/YYYY') and b.C_1 < TO_DATE('30/06/2016', 'DD/MM/YYYY') + 1)
and b.id=(select max(b.id)
FROM a, b
WHERE a.C_1 like '406%'
and (a.C_2=b.C_2)
AND (b.C_1 >= TO_DATE('30.06.2016', 'DD/MM/YYYY') and b.C_1 < TO_DATE('30/06/2016', 'DD/MM/YYYY') + 1))
Грубо говоря первым селектом я получаю много строк, а подзапросом я выбираю максимальный номер строки чтобы выбирать по каждому параметру не все строки, а только те, у которых номер максимальный.

Естественно условий больше и много строк. Поэтому запрос уходит надолго и зависает.

Подсказали, что можно воспользоваться курсором, а именно переписать в такую конструкцию:
DECLARE
Var1 NUMBER;
Var2 VARCHAR2(1000);
BEGIN
FOR e IN (select * from table…) LOOP
Var1:=e.field1;
Var2:=e.field2;
END LOOP;
END;

Прошу Вашей помощи, поскольку не совсем понимаю, что и куда пихать.

Заранее большое спасибо!
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39328916
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graph91,

b.id уникально?

.....
stax
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39329198
graph91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,
Да.
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39329965
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graph91,

не могу врубится в логику запроса
подзапрос с мах вернет одно число мах(ид) (тоесть с b берем одну строку)

так тоже долго?

select * from (
SELECT a.C_1, b.C_10
,RANK() OVER (ORDER BY b.id DESC) r
FROM a, b
WHERE a.C_1 like '406%'
and (a.C_2=b.C_2)
AND (b.C_1 >= TO_DATE('30.06.2016', 'DD/MM/YYYY') and b.C_1 < TO_DATE('30/06/2016', 'DD/MM/YYYY') + 1)
)
WHERE r=1;

ps
мож переписать сам запрос
уйти от b.id=(select max(b.id)


ps
на счет FOR e IN (select * from table…)
а так понимаю предлагают
добавить order by, проветчить с мах и exit c цикла
stax
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330063
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. может как-то так?
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT MAX(a.c_1) KEEP(DENSE_RANK LAST ORDER BY b.id) a_c_1,
       MAX(b.c_10) KEEP(DENSE_RANK LAST ORDER BY b.id) b_c_10
  FROM a, b
 WHERE a.C_1 LIKE '406%'
   AND a.C_2=b.C_2
   AND b.C_1 BETWEEN TO_DATE('30.06.2016', 'DD/MM/YYYY') AND TO_DATE('30/06/2016', 'DD/MM/YYYY') + 1


2. Но скорее всего, надо смотреть план
3. Возможно, какая-то большая обработка и про курсор упомянули, чтобы обработку вести по частям?
Тогда например посмотреть условие по rownum, разбивку на диапазоны по rowid и тп
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330076
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и индексы по a.C_1 и по b.C_1 должны бы быть наверно )
При чем желательно имхо
индекс a(c_1, c_2)
и
индекс b(c_2, c_1)
Если запрос строится от таблицы "a".
Если от таблицы "b", то возможно
индекс a(c_2, c_1)
и
индекс b(c_1, c_2)
Как вариант, попробовать use_nl для этих a и b ) (поэтому тоже могли упомянуть цикл)
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330087
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge,

запрос может возвращать несколько строк із а

.....
stax
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330094
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax.., точно, сори.
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330109
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graph91на счет FOR e IN (select * from table…)
а так понимаю предлагают
добавить order by, проветчить с мах и exit c цикла
Возможно, хотят, чтобы сразу достал максимальные Id cгруппировав по чему-либо (чему это вам виднее),
а потом уже в цикле брать эти id и подставлять во внешний запрос.
Надо или уточнять или решать с этим запросом, план, индексы и тд )

А может так? )
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT c_1, c_10 FROM 
      (SELECT /*+ use_nl(a b)*/
              a.c_1, b.c_10, 
              DENSE_RANK() over (order by b.id) AS rnk, 
              COUNT(DISTINCT ID) OVER() cnt
         FROM a, b
        WHERE a.C_1 LIKE '406%'
          AND a.C_2=b.C_2
          AND b.C_1 BETWEEN TO_DATE('30.06.2016', 'DD/MM/YYYY') and b.C_1 < TO_DATE('30/06/2016', 'DD/MM/YYYY'))
     WHERE rnk = cnt
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330113
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graph91задаю глупые вопросыне майся дурью, от незнания sql незнание plsql не спасает.
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330117
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge,

... order by b.id DESC =1

.....
stax
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330130
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..., точно, проще, спасибо )
...
Рейтинг: 0 / 0
Помогите переписать запрос в конструкцию.
    #39330145
graph91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, всем большое спасибо! Отдельное -
stax.. и Avotge за неравнодушие и помощь в решении проблемы!
Все получилось!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите переписать запрос в конструкцию.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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