Oracle SELECT - вопрос о производительности - PullRequest
0 голосов
/ 25 июня 2019

Есть таблица:

key1, fkey1, option, symbol
1     5      'A'     1
2     6      'B'     1
3     7      'C'     1
4     8      'D'     2

Допустим, у меня есть данные записи key1=2.Эта строка имеет symbol = 1, поэтому моя цель - получить все строки (особенно значения столбца fkey1), где symbol = 1 (желаемый результат здесь: fkey = 5,6,7).

Вопрос: Можно ли это сделать одним select запросом, и запрашивать эту таблицу ТОЛЬКО один раз (!)?Не так:

SELECT fkey1 from table where symbol = (select symbol from table where key = 2)

Я ищу способ максимально оптимизировать его.Эта таблица в действительности имеет больше столбцов, а PK / FK состоит из нескольких столбцов.

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Да, вы можете сделать это только с одним запросом и без самообъединений.Используйте аналитическую функцию по всей таблице, чтобы найти соответствующий символ:

Установка Oracle :

CREATE TABLE table_name ( key1, fkey1, "option", symbol ) AS
SELECT 1, 5, 'A', 1 FROM DUAL UNION ALL
SELECT 2, 6, 'B', 1 FROM DUAL UNION ALL
SELECT 3, 7, 'C', 1 FROM DUAL UNION ALL
SELECT 4, 8, 'D', 2 FROM DUAL;

Запрос :

SELECT *
FROM   (
  SELECT t.*,
         MAX( CASE key1 WHEN 2 THEN symbol END ) OVER () AS symbol_to_match
  FROM   table_name t
)
WHERE  symbol = symbol_to_match

Выход :

KEY1 | FKEY1 | option | SYMBOL | SYMBOL_TO_MATCH
---: | ----: | :----- | -----: | --------------:
   1 |     5 | A      |      1 |               1
   2 |     6 | B      |      1 |               1
   3 |     7 | C      |      1 |               1

дБ <> скрипка здесь

0 голосов
/ 25 июня 2019

Вы можете избежать подзапроса, но вам понадобится объединение с одним и тем же столом два раза

select  a.fkey1 
from table a 
inner join table b  on a.symbol = b.symbol  and b.fkey1 = 2 

с соответствующим индексом на символе или составным индексом на символе и fkey1 производительность должна быть хорошей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...