Задать вопрос
@max4107575

Как сделать двойной SELECT из одной и той же таблицы?

В СУБД ORACLE нужно выбрать в таблице MY_TABLE все записи у которых COL_3 = 4107575, а затем в ней же выбрать все остальные записи у которых COL_1,COL_2 соответствуют тем, которые были выбраны.
Индексы в таблице созданы COL_1,COL_2 и COL_3.

делаю
SELECT * FROM MY_TABLE WHERE (COL_1,COL_2) IN
(SELECT COL_1 ,COL_2 FROM MY_TABLE WHERE COL_3 = 4107575)

И поиск происходит очень долго
При том что SELECT COL_1 AS COL_1_N,COL_2 AS COL_2_N FROM MY_TABLE WHERE COL_3 = 4107575 дает всего несколько строк.
Если выбрать одну строку
SELECT * FROM MY_TABLE WHERE (COL_1,COL_2) =
(SELECT COL_1,COL_2 FROM MY_TABLE WHERE COL_3 = 4107575 FETCH NEXT 1 ROWS ONLY)

, то поиск происходит мгновенно.
Пробовал
SELECT * FROM MY_TABLE,(SELECT COL_1 AS COL_1_N,COL_2 AS COL_2_N FROM MY_TABLE WHERE COL_3 = 4107575) WHERE COL_1=COL_1_N, COL_2=COL_2_N

Также бесконечно долго происходит выборка.
  • Вопрос задан
  • 260 просмотров
Подписаться 1 Простой 8 комментариев
Пригласить эксперта
Ответы на вопрос 3
vhood
@vhood
Не забывайте отмечать решения
SELECT a.* FROM MY_TABLE a
INNER JOIN MY_TABLE b
ON a.COL_1 = b.COL_1 AND a.COL_2 = b.COL_2
WHERE b.COL_3 = 4107575
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
ВЫБРАТЬ * ИЗ ТАБЛИЦА КАК Т1
  СВЯЗАТЬ ТАБЛИЦА КАК Т2 ПО Т2.К1 = Т1.К1 И Т2.К2 = Т1.К2
  ГДЕ Т2.К3 = 4107575
Ответ написан
@AKimovd
With q as (Select /*+ materialize */ COL_1 ,COL_2 FROM MY_TABLE WHERE COL_3 = 4107575) 
SELECT * FROM MY_TABLE WHERE (COL_1,COL_2) IN
(select * FROM q)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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