创建SQL UNION,其中union的第二面取决于第一面

时间:2011-10-22 20:33:42

标签: 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两个相互依赖的查询?

2 个答案:

答案 0 :(得分:2)

从你的部分例子中我认为你试图制作一个recursive query,而不是一个经典的UNION查询,如果事实上这是UNIONS的原因。

您需要在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;

答案 1 :(得分:0)

您的查询中的SELECT * FROM company_res t1将为您提供company_res以外的所有内容,无论您UNION使用company_res还是其他内容。我怀疑这就是你要找的东西。请参阅shahkalpesh的答案。