Есть ли способ оптимизировать запрос, состоящий из объединения и длинного списка проекций? - PullRequest
0 голосов
/ 10 января 2019

query1 ---> Существует запрос, состоящий из 22 соединений (21 слева и 1 снаружи). И имея длинный список проекций.

UNION

query2 -> есть второй запрос, имеющий 21 соединение (21 левое внешнее соединение) и такой же набор списка проекций.

Есть ли в любом случае так, что мне нужно написать список проекции только один раз и общие объединения в query1 и query2. ?

(Примечание: 21 левые внешние объединения в обоих запросах находятся в таблицах)

1 Ответ

0 голосов
/ 10 января 2019

В документации здесь говорится:

Соответствующие выражения в списках выбора компонента запросы составного запроса должны совпадать по числу и должны быть в та же группа типов данных (например, числовой или символьный).

Это означает, что вы не можете обойтись без указания списка проекций только один раз, так как это требование для оператора UNION.

Однако есть некоторые вещи, которые вы можете сделать для части выбора. Если к query1 и query2 присоединены общие таблицы / представления (внешние), то вы можете получить их из UNION, отделив эту часть и присоединив к ней общие таблицы / представления, рассматривая часть UNION как отдельный VIEW.

Если бы вы предоставили упрощенный пример ваших запросов, это было бы лучше, но вот пример, который я придумал:

Учитывая этот запрос (предположительно похожий на ваш):

SELECT t0.col1, t2.col2 FROM table0 t0, table2 t2 WHERE t0.col = t2.col(+)
UNION
SELECT t1.col1, t2.col2 FROM table1 t1, table2 t2 WHERE t1.col = t2.col(+);

Вы можете заменить его на:

SELECT q1.col1, t2.col2 FROM
(
  select t0.col1, t0.col FROM table0 t0
  UNION
  select t1.col1, t1.col FROM table0 t1
) q1,
table2 t2
WHERE q1.col = t2.col(+);

Приветствия

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