【问题标题】:Join two select queries horizontally in Postgresql在 Postgresql 中水平连接两个选择查询
【发布时间】:2014-12-16 07:11:16
【问题描述】:

我有以下两个查询:

查询 #1:

(SELECT 
    pl.c_project_Id, pl.c_projectphase_Id, pl.c_projecttask_Id, pl.m_product_Id,
    pj.name as projectname, ph.name as phasename, pt.name as taskname, pd.name as prodname,
    round(pl.plannedqty, 2) as planqty, round(pl.plannedprice, 2) as planrate,
    round(pl.plannedamt, 2) as planamt

FROM adempiere.c_projectline pl
LEFT JOIN adempiere.c_project pj ON pl.c_project_id = pj.c_project_id
LEFT JOIN adempiere.c_projectphase ph ON pl.c_projectphase_id = ph.c_projectphase_id
LEFT JOIN adempiere.c_projecttask pt ON pl.c_projecttask_id = pt.c_projecttask_id
LEFT JOIN adempiere.m_product pd ON pl.m_product_id = pd.m_product_id
WHERE pl.c_project_id = 1000001 AND pl.ad_client_id = 1000000
ORDER BY ph.c_projectphase_id, pt.c_projecttask_id)

输出为:11 列 16 行

查询 #2:

(SELECT
    fa.c_project_id, fa.c_projectphase_id, fa.c_projecttask_id, fa.m_product_id,
    pj.name as costprojectname, ph.name as costphasename, pt.name as costtaskname,
    pd.name as costprodname,
    abs(fa.qty) as costqty, round((fa.amtacctdr/fa.qty), 2) as costrate,
    round(sum(fa.amtacctdr), 0) as costamt

FROM adempiere.fact_acct fa
LEFT JOIN adempiere.c_project pj ON fa.c_project_id = pj.c_project_id
LEFT JOIN adempiere.c_projectphase ph ON fa.c_projectphase_id = ph.c_projectphase_id
LEFT JOIN adempiere.c_projecttask pt ON fa.c_projecttask_id = pt.c_projecttask_id
LEFT JOIN adempiere.m_product pd ON fa.m_product_id = pd.m_product_id
WHERE  fa.c_project_id = 1000001 AND (fa.gl_category_id = 1000006 OR fa.gl_category_id = 1000005)
AND fa.qty > 0 AND fa.c_project_id is not null
GROUP BY fa.m_product_id, fa.c_project_id, fa.c_projectphase_id, fa.c_projecttask_id,
        fa.qty, fa.amtacctdr,
        pj.name, ph.name, pt.name, pd.name)

输出为:11 列 6 行

我想水平加入这些查询,显示所有列但行不应该重复。当我应用联合加入它们时,结果显示重复的行。我该如何处理这个问题?

【问题讨论】:

  • 如何匹配查询之间的行?

标签: sql postgresql-9.1


【解决方案1】:

您应该能够像这样加入查询:

select * from
  (
   <your first query here>
  ) tbl1
  join (
    <your second query here>
  ) tbl2
  on tbl1.c_project_Id = tbl2.c_project_Id
 and tbl1.c_projectphase_Id = tbl2.c_projectphase_Id -- you might add or
 and tbl1.c_projecttask_Id  = tbl2.c_projecttask_Id  -- remove join criteria 
 and tbl1.m_product_Id = tbl2.m_product_Id           -- here

【讨论】:

  • alzaimar 谢谢您的回复。我应用了您的解决方案,但它显示了所有列,并且只有 6 行符合所有条件。但是我需要来自第一个查询的所有 16 行和来自第二个查询值的列(costqty,costrate,aostamt),其中条件匹配,否则显示为零。我该怎么办?
  • 改用“完全连接”。只显示 6 行的原因很可能是因为只有 6 行共享相同的“连接”标准。所以在 'join' 关键字之前添加一个 'full' 并检查结果。
  • 是的,“FULL JOIN”正在工作,我得到的结果非常准确。非常感谢您的帮助。
  • 我没有得到查询,直到我在这里查看stackoverflow.com/questions/16653828/…
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2011-05-02
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多