Создание ОБЪЕДИНЕНИЯ SQL, где вторая сторона объединения зависит от первой стороны

#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.