@Botu

Какая последовательность в разборе select unique ... у оракла?

Представим есть 2 таблицы.
table1
id {1,2,3,4,5,6} уникальные
key {0,1,0,5,4,1} любые значения
table2
id {3,4,5,6}

Если я в oracle делаю запрос
select unique t1.key from tabl1 t1, tabl2 t2 where t1.id = t2.id

что будет в результате: (поле key = 0 id = 1 проверили и другие поля key = 0 не проверяем, так как select unique key)
5
4
1
или (в выборку key=0 id=1 не попало, поэтому проверяем другое поле с key = 0)
0
5
4
1
  • Вопрос задан
  • 286 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Oraclist
CREATE TABLE table1 ( ID NUMBER, KEY NUMBER ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 1, 0 ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 2, 1 ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 3, 0 ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 4, 5 ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 5, 4 ) ;
INSERT INTO table1 ( ID, KEY ) VALUES ( 6, 1 ) ;
CREATE TABLE table2 ( ID NUMBER ) ;
INSERT INTO table2 ( ID ) VALUES ( 3 ) ;
INSERT INTO table2 ( ID ) VALUES ( 4 ) ;
INSERT INTO table2 ( ID ) VALUES ( 5 ) ;
INSERT INTO table2 ( ID ) VALUES ( 6 ) ;
COMMIT ;
SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;

План исполнения будет следующий
Plan Hash Value  : 1501084449 

----------------------------------------------------------------------
| Id  | Operation              | Name   | Rows | Bytes | Cost | Time |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT       |        |      |       |      |      |
|   1 |   SORT UNIQUE          |        |      |       |      |      |
|   2 |    MERGE JOIN          |        |      |       |      |      |
|   3 |     SORT JOIN          |        |      |       |      |      |
|   4 |      TABLE ACCESS FULL | TABLE2 |      |       |      |      |
| * 5 |     SORT JOIN          |        |      |       |      |      |
|   6 |      TABLE ACCESS FULL | TABLE1 |      |       |      |      |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 5 - access("T1"."ID"="T2"."ID")
* 5 - filter("T1"."ID"="T2"."ID")

План читается с самого "правого" к самому "левому".
Т.е. сначала самая вложенная строка и вверх по дереву.
Собственно SORT UNIQUE выполняет предпоследним пунктом.
Отвечая на вопрос, сначала будет соединение и фильтрация ( строка 5 плана ) и только потом отбор уникальных строк/значений.
Правильный ответ такой ( не забываем про сортировку )
SQL> SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;
       KEY
----------
         0
         1
         4
         5

SQL>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы