Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
  • Страница:
  • 1
  • 2
  • 3
  • 4

ТЕМА: Подскажите как правильно написать SQL запрос в Oracle

Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:30 #2829

  • Rita
  • Rita аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 48
  • Спасибо получено: 0
Допустим имеем такую таблицу:
create table test (col1 number(3), col2 number(3), col3 number(3));

insert into test values (1,1,1);
insert into test values (1,1,2);
insert into test values (1,2,2);
insert into test values (1,2,1);
insert into test values (2,1,1);
insert into test values (2,1,2);
insert into test values (2,2,1);
insert into test values (2,2,2);
insert into test values (3,1,1);
insert into test values (3,1,2);
insert into test values (3,2,1);
insert into test values (3,2,2);

select * from test;

COL1 COL2 COL3
---------- ---------- ----------
1 1 1
1 1 2
1 2 2
1 2 1
2 1 1
2 1 2
2 2 1
2 2 2
3 1 1
3 1 2
3 2 1
3 2 2


Запрос должен выбрать только одну строку удовлетворяющую такому условию (например) COL1 < 3,
для самого большого COL1 < 3 нужно найти самое большое COL2 < 5, для самых больших COL1 < 3 и COL2 < 5
нужно найти COL3 < 2 тоже самое большое.
Т.е. при таких условиях запрос должен вернуть строку
COL1 COL2 COL3
---------- ---------- ----------
2 2 1

ессно хорошо бы, чтоб он имел приличный план выполнения Т.к. работать он будет на больших таблицах.
И надо еще чтоб этот запрос можно было использовать с for update в случае необходимости )
Вобщем кто чего сможет, подскажите...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:31 #2830

select /*+ PUSH_SUB(v)*/
max(col1),max(col2),col3 from
(
select max(col1) col1 ,max(col2) col2,max(col3) col3
from test t
where col1 < 3
and col3 < 2
and col2 < 5
group by col1,col3) v
group by col3

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:32 #2831

  • Pond
  • Pond аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Тут может быть закавыка в том, что 2 агрегата совсем необязательно вернут данные одной строки, т.е. max(col1) может быть в одной строке, а max(col2) в другой. Можно так:
select t.col1

     , t.col2

     , t.col3

from (

  select t.*

  from test t

  where 1=1

    and t.col1 < 3

    and t.col2 < 5

    and t.col3 < 2

) t

order by t.col1 desc

       , t.col2 desc

       , t.col3 desc
1-я строка в result-set'е и есть требуемый результат. Причем, коль уж уникальность данных оговорена не была, записей, одновременно удовлетворяющих условую, может быть несколько. Они будут идти друг за другом.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:33 #2832

  • Rita
  • Rita аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 48
  • Спасибо получено: 0
Pond, Примерно так сейчас и сделано... но это не очень хороший вариант, т.к. представь себе таблицу в 100000 строк и все они попадают в условие... наблюдаем грустную картину, и даже если сделать select * from (....) where rownum < 2
все равно запрос работает долго.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:37 #2833

Вообще-то , внешний селект работает с RECORDSET, так-что все равно вытянет нужное.
Ну а насчет performance -
1 Использовать HINT
2. Если ты работаешь с SQL99, то используй опцию OVER (Partition by....).
Regards!

П.С. Тест на UNIX/Oracle8 на 10000000 rоws дал результат через 12,5 сек.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Подскажите как правильно написать SQL запрос в Oracle 23 июль 2011 10:38 #2834

  • Pond
  • Pond аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Что сказать... Надеюсь, составной индекс по (col1, col2, col3) существует? А если твой запрос теоретически способен возвратить 100,000 записей- может, в консерватории что-нибудь подправить надо? Попробуй открыть курсор с хинтом FIRST_ROW, профетчить первую запись и вернуть ее.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
  • 4