Повторное использование результатов выполнения подзапроса

Подскажите, пожалуйста, каким образом использовать несколько WITH в одном запросе?
Или как по-другому возможно повторное обращение к результату выполнения подзапроса?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Если я правильно понял

Если я правильно понял вопрос, то просто указываете имя выражения столько, сколько требуется.
Например:

WITH temp AS (SELECT 1 AS p1, 2 AS p2, 3 AS p3)
SELECT * FROM temp
UNION ALL
SELECT * FROM temp

Спасибо. Чего-то я себе,

Спасибо. Чего-то я себе, видимо, придумал. Теперь понятно.

Стоп Вот запрос: WITH

Стоп
Вот запрос:
WITH RECURSIVE all_deps(id, caption, parent_id)
AS
(
SELECT
deps.id,
deps.parent_id
FROM public.deps AS deps
WHERE deps.id = 34

UNION ALL

SELECT
deps.id,
deps.parent_id
FROM all_deps AS all_deps,
public.deps AS deps

WHERE deps.parent_id = all_deps.id)
--------------------

WITH RECURSIVE all_deps2(id, caption, parent_id)
AS
(
SELECT
deps.id,
deps.parent_id
FROM public.deps AS deps
WHERE deps.id = 43

UNION ALL

SELECT
deps.id,
deps.parent_id
FROM all_deps AS all_deps,
public.deps AS deps

WHERE deps.parent_id = all_deps.id)
---------------------
SELECT
*
FROM all_deps2 JOIN all_deps ON (all_deps2.id = all_deps.id )

Мне нужно поразному обработать Подчиненые элементы первого подразделения и второго, а результат вывести вместе. Почему-то ругается на второй WITH.

Неясно то, что вы пытаетесь

Неясно то, что вы пытаетесь сделать, потому что я полагаю, что это можно сделать проще: слишком уж операции банальные. Пробовать с 2-я подзапросами WITH сейчас не смогу, нет под рукой PostgreSQL, однако предложить решение в лоб можно:
Вместо all_deps2 или all_deps в тексте

SELECT
*
FROM all_deps2 JOIN all_deps ON (all_deps2.id = all_deps.id )

вставьте свой длинный запрос как подзапрос, например:
SELECT
*
FROM all_deps2 JOIN 
(SELECT * FROM ... UNION ALL SELECT * FROM ....) AS all_deps ON (all_deps2.id = all_deps.id )

Кстати, зачем вам там RECURSIVE?

RECURSIVE мну нужен для

RECURSIVE мну нужен для поиска подчиненных элементов.
Я может быть привел плохой пример. Суть вопроса в том, можно ли использовать WITH несколько раз?

Ларчик как обычно открывается

Ларчик как обычно открывается просто:

WITH temp AS (SELECT 1 AS p1, 2 AS p2, 3 AS p3),
     temp2 AS (SELECT 1 AS p1, 4 AS p2, 5 AS p3)
SELECT * FROM temp,temp2

Просто, чтобы объявить ещё один WITH, нужно не писать это ключевое слово, а перед ним поставить запятую. Надеюсь, ты сможешь свой запрос переделать. Источник http://www.postgresql.org/docs/9.1/static/queries-with.html

Да. Спасибо.

Да.
Спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023