#sql #postgresql
#sql #postgresql
Вопрос:
Я бы.хотелось бы выполнить объединение двух запросов, где второй запрос зависит от первого:
SELECT * FROM company_res t1
UNION
SELECT * FROM company_res t2
WHERE t2.company_id IN (
SELECT c.id
FROM company c
WHERE c.parent_id = t1.company_id
)
ORDER BY company_id, year_code
Однако, когда я запускаю эти запросы в psql, я получаю сообщение об ошибке о том, что t1 во втором запросе имеет FROM
-предложение.
Возможно ли иметь UNION
запросы oftow, которые зависят друг от друга?
Комментарии:
1. Что вы пытаетесь сделать? Концептуально отправленный вами запрос, похоже, не имеет никакого смысла. Возможно, опубликуйте некоторые примеры данных и желаемых результатов.
Ответ №1:
Из вашего частичного примера я думаю, что вы пытаетесь выполнить рекурсивный запрос, а не классический запрос ОБЪЕДИНЕНИЯ, это adavnced для ОБЪЕДИНЕНИЙ, если факт.
Вам нужно выполнить некоторые выборки в company_res, а затем добавить родительские элементы этих компаний.
Базовая форма:
WITH RECURSIVE t(n) AS (
SELECT 1
UNION ALL
SELECT n 1 FROM t
)
SELECT n FROM t LIMIT 100;
В вашем случае что-то подобное может быть:
WITH RECURSIVE rectable(
company_id,
field2,
field3,
parent_id) AS (
-- here the starting rows, t1 in your example
SELECT
company_res.company_id,
company_res.field2,
company_res.field3,
company.parent_id
FROM company_res
INNER JOIN company ON company_res.company_id=company.id
WHERE (here any condition on the starting points)
UNION ALL
-- here the recursive part
SELECT
orig.company_id,
orig.field2,
orig.field3,
orig.parent_id
FROM rectable rec,company_res orig
INNER JOIN company ON orig.company_id=company.id
WHERE company.parent_id=rec.company_id
-- here you could add some AND sections if you want
)
SELECT company_id,field2, field3,parent_id
FROM rectable
ORDER BY parent_id;
Ответ №2:
SELECT * FROM company_res t1
В вашем запросе вам будет предоставлено все company_res
, независимо от того, с чего еще вы UNION
это company_res
делаете. Я сомневаюсь, что это то, что вы ищете. Смотрите ответ от shahkalpesh.