суббота, 12 января 2013 г.

Использование подзапросов в ORACLE

Типы подзапросов:

Однострочные
возвращают 0 или 1 строку
(если к тому же возвращается и один столбец то подзапрос скалярный)

Многострочные
возвращают одну или несколько строк

Подзапросы можно еще разделить на подтипы:

многостолбцовые

корелированные
(ссылаются на один или несколько столбцов во внешнем запросе)

вложенные
(помещены внутрь другого  подзапроса, уровень вложенности может достигать 255)


Однострочные подзапросы.

Подзапросы во фразе WHERE:

select col1, col2
from tab
where col_tab_id = (select col_tab_id
                    from tab
                    where col2 = 'XXX');

Во фразе WHERE  можно использовать операторы сравнения такие как:
=, <>, <, >, <=, >=

select col1, col2, col3
from tab
where col3 > (select avg(col3)
              from tab);

этот подзапрос является примером скалярного подзапроса.


Подзапросы во фразе HAVING:

select col1, avg(col2)
from tab
group by col1
having avg(col2) <  (select max(avg(col2))
                     from tab
                     group by col1)
order by col1;


Подзапросы во фразе FROM:
(встроенные представления)


select col1
from (select col1
      from tab
      where col1 < 10);


более полезный пример:

select t1.col_tab1_id, col2, t2.COL_TAB1_ID_COUNT
from tab1 t1, (select col_tab1_id, count(col_tab1_id) COL_TAB1_ID_COUNT
               from tab2
               group by col_tab1_id) t2
where t1.col_tab1_id =  t2.col_tab1_id;


Подзапросы не могут содержать фразу order by.
Любое упорядочивание должно проводиться во внешнем запросе:

select col1, col2, col3
from tab
where col3 > (select avg(col3) from tab)
order by col1 desc;

Многострочные подзапросы
Возвращают во внешний запрос одну или более строк.

Чтобы обработать подзапрос, возвращающий несколько строк, необходимо использовать один из операторов:
IN, ANY или ALL.

select col1, col2
from tab
where col1 IN (5,6,7);

Использование IN в многострочных подзапросах:

select col1, col2
from tab
where col1 IN (select col1
                from tab
                where col2 like '_z%');


select col1, col2
from tab1
where col1 NOT IN (select col1 from tab2 );


Использование ANY в многострочных подзапросах:

ANY используется для сравнения значения с любым значением в списке.
Перед ANY можно использовать операторы сравнения такие как:
=, <>, <, >, <=, >=

select col1, col2
from tab1
where col3 < ANY (select col1 from tab2 );


Использование ALL в многострочных подзапросах:

ALL используется для сравнения значения со всеми значениями из списка.
Перед ALL можно использовать операторы сравнения такие как:
=, <>, <, >, <=, >=

select col1, col2
from tab1
where col3 > ALL (select col1 from tab2 );


Многостолбцовые подзапросы:

Подзапросы могут возвращать несколько столбцов:

select col1, col2, col3
from tab1
where (col1, col3) IN
      (select col1, min(col3)
       from tab1
       group by col2);


Коррелированные подзапросы

Коррелированный подзапрос выполняется по одному разу для каждой строки внешнего запроса.
Коррелированный подзапрос может разрешать значения NULL.

Обычно коррелированный подзапрос используется когда мы хотим узнать некую зависимость
от значения в каждой строке внешнего запроса.

select col1, col2, col3, col4
from tab out
where col4 > (select avg(col4) from tab inn
              where inn.col2 = out.col2);

тут строки внешнего запроса по очереди передаются в подзапрос.


Использование EXISTS и NOT EXISTS с коррелированными подзапросами.

EXISTS используется для проверки, существует ли хоть одна строка, возвращенная подзапросом.
NOT EXISTS проверяет что не существует ни одной строки, возвращенной подзапросом.

select col1, col2
from tab out
where EXISTS (select col1 from tab inn
              where inn.col3 = out.col1);

не важно сколько строк возвращает подзапрос,
важно знать, возвращаются ли в принципе какие либо строки.

Подзапрос не обязян возвращать столбец, можно возвратить литеральное значение,
что повысит производительность:

select col1, col2
from tab out
where EXISTS (select 1 from tab inn
              where inn.col3 = out.col1);


до тех пор, пока подзапрос возвращает одну или более строк
EXISTS возвращает TRUE.

если подзапрос не возвращает ни одной строки
EXISTS возвращает FALSE.

Использование NOT EXISTS с коррелированными подзапросами.

select col1, col2
from tab1 out
where NOT EXISTS (select 1 from tab2 inn
                  where inn.col1 = out.col1);


Отличие EXISTS от IN

EXISTS проверяет только сам факт существования строк
IN проверяет их реальные значения
EXISTS более производительные оператор чем IN
Если в списке значений есть NULL, то NOT EXISTS возвратит TRUE, а NOT IN - FALSE.

select col1, col2
from tab1 out
where NOT EXISTS (select 1 from tab2 inn
                  where inn.col1 = out.col1);


select col1, col2
from tab1
where NOT IN (select col1 from tab2);

Разрешить NULL можно так:

select col1, col2
from tab1
where NOT IN (select nvl(col1,0) from tab2);

Вложенные подзапросы:

максимальная глубина вложенности - 255
Лучше использовать соединения чем вложенность.
Глубокая вложенность влияет на производительность.

select col1, avg(col2)
from tab1
group by col1
having avg(col2) < (select max(avg(col1))
                    from tab1
                    where col1 IN (select col1 from tab2 where col2 > 1)
                    group by col1)
order by col1;


UPDATE и DELETE c подзапросами:

update tab1 set col1 = (select avg(col1) from tab2)
where col2 = 4;

delete from tab1
where col1 > (select avg(col1) from tab2);


Quick Reference to RDBMS Database Patchset Patch Numbers [ID 753736.1]


What is the patch number of a patchset?

Patchset/PSU Patch Number Description
























11.2.0.3.4 14275605
DATABASE PATCH SET UPDATE 11.2.0.3.4 (INCLUDES CPUOCT2012)
11.2.0.3.3 13923374 DATABASE PATCH SET UPDATE 11.2.0.3.3 (INCLUDES CPU JUL2012):
11.2.0.3.2 13696216 DATABASE PATCH SET UPDATE 11.2.0.3.2 (INCLUDES CPU APR2012)
11.2.0.3.1 13343438 DATABASE PATCH SET UPDATE 11.2.0.3.1 (INCLUDES CPU JAN2012)
11.2.0.3 10404530 11.2.0.3.0 PATCH SET FOR ORACLE DATABASE SERVER
11.2.0.2.8 14275621 DATABASE PATCH SET UPDATE 11.2.0.2.8 (INCLUDES CPUOCT2012)
11.2.0.2.7 13923804 DATABASE PATCH SET UPDATE 11.2.0.2.7 (INCLUDES CPU JUL2012)
11.2.0.2.6 13696224 DATABASE PATCH SET UPDATE 11.2.0.2.6 (INCLUDES CPU APR2012)
11.2.0.2.5 13343424 DATABASE PATCH SET UPDATE 11.2.0.2.5 (INCLUDES CPU JAN2012)
11.2.0.2.4 12827726 DATABASE PSU 11.2.0.2.4 (INCLUDES CPUOCT2011)
11.2.0.2.3 12419331 DATABASE PSU 11.2.0.2.3 (INCLUDES CPUJUL2011)
11.2.0.2.2 11724916 DATABASE PSU 11.2.0.2.2 (INCLUDES CPUAPR2011)
11.2.0.2.1 10248523 DATABASE PSU 11.2.0.2.1
11.2.0.2 10098816 11.2.0.2.0 PATCH SET FOR ORACLE DATABASE SERVER
11.2.0.1.6 12419378  DATABASE PSU 11.2.0.1.6 (INCLUDES CPUJUL2011)
11.2.0.1.5 11724930 DATABASE PSU 11.2.0.1.5 (INCLUDES CPUAPR2011)
11.2.0.1.4 10248516 DATABASE PSU 11.2.0.1.4 (INCLUDES CPUJAN2011)
11.2.0.1.3 9952216 DATABASE PSU 11.2.0.1.3 (INCLUDES CPUOCT2010)
11.2.0.1.2 9654983 DATABASE PSU 11.2.0.1.2 (INCLUDES CPUJUL2010)
11.2.0.1.1 9352237 DATABASE PSU 11.2.0.1.1
11.1.0.7.13 14275623 [*] DATABASE PATCH SET UPDATE 11.1.0.7.13 (INCLUDES CPUOCT2012)
11.1.0.7.12 13923474 DATABASE PATCH SET UPDATE 11.1.0.7.12 (INCLUDES CPU JUL2012)
11.1.0.7.11 13621679 DATABASE PATCH SET UPDATE 11.1.0.7.11 (INCLUDES CPU APR2012)
11.1.0.7.10 13343461 DATABASE PATCH SET UPDATE 11.1.0.7.10 (INCLUDES CPU JAN2012)
11.1.0.7.9 12827740 DATABASE PSU 11.1.0.7.9 (INCLUDES CPUOCT2011)
11.1.0.7.8 12419384 DATABASE PSU 11.1.0.7.8 (INCLUDES CPUJUL2011)
11.1.0.7.7 11724936 DATABASE PSU 11.1.0.7.7 (INCLUDES CPUAPR2011)
11.1.0.7.6 10248531 DATABASE PSU 11.1.0.7.6 (INCLUDES CPUJAN2011)
11.1.0.7.5 9952228 DATABASE PSU 11.1.0.7.5 (INCLUDES CPUOCT2010)
11.1.0.7.4 9654987 DATABASE PSU 11.1.0.7.4 (INCLUDES CPUJUL2010)
11.1.0.7.3 9352179 DATABASE PSU 11.1.0.7.3 (INCLUDES CPUAPR2010)
11.1.0.7.2 9209238 DATABASE PSU 11.1.0.7.2 (INCLUDES CPUJAN2010)
11.1.0.7.1 8833297 DATABASE PSU 11.1.0.7.1 (INCLUDES CPUOCT2009)
11.1.0.7 6890831 11.1.0.7.0 PATCH SET FOR ORACLE DATABASE SERVER
10.2.0.5.9 14275629 [*] DATABASE PATCH SET UPDATE 10.2.0.5.9 (INCLUDES CPUOCT2012)
10.2.0.5.8 13923855 [*] DATABASE PATCH SET UPDATE 10.2.0.5.8 (INCLUDES CPU JUL2012)
10.2.0.5.7 13632743 [*] DATABASE PATCH SET UPDATE 10.2.0.5.7 (INCLUDES CPU APR2012)
10.2.0.5.6 13343471 [*] DATABASE PATCH SET UPDATE 10.2.0.5.6 (INCLUDES CPU JAN2012)
10.2.0.5.5 12827745 [*] DATABASE PSU 10.2.0.5.5 (INCLUDES CPUOCT2011)
10.2.0.5.4 12419392 DATABASE PSU 10.2.0.5.4 (INCLUDES CPUJUL2011)
10.2.0.5.3 11724962 DATABASE PSU 10.2.0.5.3 (INCLUDES CPUAPR2011)
10.2.0.5.2 10248542 DATABASE PSU 10.2.0.5.2 (INCLUDES CPUJAN2011)
10.2.0.5.1 9952230 DATABASE PSU 10.2.0.5.1 (INCLUDES CPUOCT2010)
10.2.0.5 8202632 10.2.0.5.0 PATCH SET FOR ORACLE DATABASE SERVER
10.2.0.4.14 14275630 [**] DATABASE PSU 10.2.0.4.14 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUOCT2012)
0.2.0.4.13 13923851 [*] DATABASE PSU 10.2.0.4.13 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUJUL2012)
10.2.0.4.12 12879933 [*]
DATABASE PSU 10.2.0.4.12 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUAPR2012)
10.2.0.4.11 12879929 [*] DATABASE PATCH SET UPDATE 10.2.0.4.11 (PRE-REQ 10.2.0.4.4|INCLUDES CPUJAN2012)
10.2.0.4.10 12827778 DATABASE PSU 10.2.0.4.10 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUOCT2011)
10.2.0.4.9 12419397 DATABASE PSU 10.2.0.4.9 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUJUL2011)
10.2.0.4.8 11724977 DATABASE PSU 10.2.0.4.8 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUAPR2011)
10.2.0.4.7 10248636 DATABASE PSU 10.2.0.4.7 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUJAN2011)
10.2.0.4.6 9952234 DATABASE PSU 10.2.0.4.6 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUOCT2010) 
10.2.0.4.5 9654991 DATABASE PSU 10.2.0.4.5 (REQUIRES PRE-REQUISITE 10.2.0.4.4|INCLUDES CPUJUL2010)    [overlay PSU]
10.2.0.4.4 9352164 DATABASE PSU 10.2.0.4.4 (INCLUDES CPUAPR2010)
10.2.0.4.3 9119284 DATABASE PSU 10.2.0.4.3 (INCLUDES CPUJAN2010)
10.2.0.4.2 8833280 DATABASE PSU 10.2.0.4.2 (INCLUDES CPUOCT2009)
10.2.0.4.1 8576156 DATABASE PSU 10.2.0.4.1 (INCLUDES CPUJUL2009)
10.2.0.4 6810189 10.2.0.4.0 PATCH SET FOR ORACLE DATABASE SERVER
10.2.0.3 5337014 10.2.0.3 PATCH SET FOR ORACLE DATABASE SERVER
10.2.0.2 4547817 10.2.0.2 PATCH SET FOR ORACLE DATABASE SERVER
10.1.0.5 4505133 10.1.0.5 PATCH SET FOR ORACLE DATABASE SERVER
10.1.0.4 4163362 10.1.0.4 PATCH SET FOR ORACLE DATABASE SERVER
10.1.0.3 3761843 10.1.0.3 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.8 4547809 9.2.0.8 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.7 4163445 9.2.0.7 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.6 3948480 9.2.0.6 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.5 3501955 ORACLE 9I DATABASE SERVER RELEASE 2 - PATCH SET 4 VERSION 9.2.0.5.0
9.2.0.4 3095277 9.2.0.4 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.3 2761332 9.2.0.3 PATCH SET FOR ORACLE DATABASE SERVER
9.2.0.2 2632931 9.2.0.2 PATCH SET FOR ORACLE DATABASE SERVER
9.0.1.5 3301544 9.0.1.5 PATCHSET
9.0.1.4 2517300 9.0.1.4 PATCH SET FOR ORACLE DATABASE SERVER
9.0.1.3 2271678 9.0.1.3. PATCH SET FOR ORACLE DATA SERVER
8.1.7.4 2376472 8.1.7.4 PATCH SET FOR ORACLE DATA SERVER
8.1.7.3 2189751 8.1.7.3 PATCH SET FOR ORACLE DATA SERVER
8.1.7.2 1909158 8.1.7.2.1 PATCH SET FOR ORACLE DATA SERVER


NOTE:
[*]   10.2.0.4 and 10.2.0.5 are now in extended support mode and PSU's released after Aug 01,2011 will need ES License to download them.
[**] Available only in limited platforms