Использовать результат запроса выбора в другом несколько раз

У меня есть один сложный запрос выбора (Query-1), который выполняется с использованием INTERSECT и возвращает идентификаторы определенного столбца.

Запрос №1:

      SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

Теперь есть еще один более сложный запрос, который требует многократного получения результата запроса №1.

Запрос №2:

      SELECT * 
FROM
    (SELECT my_id, col_1, my_value
     FROM my_table
     WHERE my_id IN (result from query-1) 
       AND col_3 IN (SELECT col_3 FROM another_table1 
                     WHERE my_id IN (result from query-1) 
                       AND another_col IN (SELECT another_col 
                                           FROM another_table2 
                                           WHERE my_id IN (result from query-1))))
    PIVOT 
        (MIN(my_value)
            FOR(col_1) IN(1 AS name, 2 AS lastname, 3 AS address)
        )

Как вы можете видеть, результаты запроса-1 требуются несколько раз в запросе-2, я попытался заменить весь запрос-1 в запрос-2 везде, где это необходимо, что увеличивает сложность и читаемость запроса.

Есть ли способ сделать это простым способом?

2 ответа

как насчет использования with предложение (пункт факторинга подзапроса):

      with query-1 as (SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table)

SELECT * FROM
(
   SELECT my_id, col_1, my_value
   FROM my_table
   WHERE my_id IN (select id from query-1) AND col_3 IN
      (SELECT col_3 FROM another_table1 WHERE my_id IN (select id from query-1) AND another_col IN
         (SELECT another_col FROM another_table2 WHERE my_id IN (select id from query-1))
)
)
PIVOT (
   MIN(my_value)
   FOR(col_1)
   IN(1 AS name, 2 AS lastname, 3 AS address)
)

Я бы определенно использовал View для любого запроса, который вы будете использовать несколько раз.

Сначала я напишу приведенный ниже код:

      Create View Query1
as
SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

Выбрав указанный выше код, я выполню (F5) его. Это сохранит вид. Затем я напишу код ниже и выполню его, когда вы захотите его вызвать:

      Select * From Query1

Или вы можете просто использовать Query1 внутри Query2.

Другие вопросы по тегам