如何处理Full Outer Join

时间:2013-03-22 15:06:39

标签: mysql mysql-5.5

我需要在mysql中进行全外连接。我在这里找到了一个解决方案:Full Outer Join in MySQL我的问题是t1和t2本身就是子查询。因此产生的查询看起来像一个怪物。 在这种情况下该怎么办?我应该使用视图而不是子查询吗?

修改 我会尝试解释一下。我有订单和付款。一次付款可以抄袭多个订单,一个订单可能会因多次付款而受阻。这就是为什么我有表订单,付款和付款项。每个订单都有现场公司(制作此订单)和经理(接受此订单)。现在,我需要按公司和经理对订单和付款进行分组并计算金额。所以我希望得到这样的东西:

company1 | managerA | 200  | 200  | 0
company1 | managerB | Null | 100  | 100
company1 | managerC | 300  | Null | -300
company2 | managerA | 150  | Null | -150
company2 | managerB | 100  | 350  | 250

查询,我设法创建:

SELECT coalesce(o.o_company, p.o_company)
     , coalesce(o.o_manager, p.o_manager)
     , o.orderstotal
     , p.paymentstotal
     , (coalesce(p.paymentstotal, 0) - coalesce(o.orderstotal, 0)) AS balance
FROM
         (((/*Subquery A*/SELECT orders.o_company
                 , orders.o_manager
                 , sum(o_money) AS orderstotal
            FROM
              orders
            WHERE
              (o_date >= @startdate)
              AND (o_date <= @enddate)
            GROUP BY
              o_company
            , o_manager) AS o
 LEFT JOIN (/*Subquery B*/SELECT orders.o_company
                , orders.o_manager
                , sum(paymentitems.p_money) AS paymentstotal
           FROM
             ((payments
           INNER JOIN paymentitems
           ON payments.p_id = paymentitems.p_id)
           INNER JOIN orders
           ON paymentitems.p_oid = orders.o_id)
           WHERE
             (payments.p_date >= @startdate)
             AND (payments.p_date <= @enddate)
           GROUP BY
             orders.o_company
           , orders.o_manager) AS p
    ON (o.o_company = p.o_company) and (o.o_manager = p.o_manager))
  union 
           (/*Subquery A*/ 
 right join /*Subquery B*/ 
    ON (o.o_company = p.o_company) and (o.o_manager = p.o_manager)))

这是我的查询的简化版本。真正的查询要复杂得多,这就是为什么我要保持它尽可能简单。甚至可能会分成视图,或者可能还有其他我不知道的选项。

2 个答案:

答案 0 :(得分:0)

如果您尝试进行完全外连接,则关系为1-1,那么您可以使用union和aggreagation完成相同的操作。

这是一个例子,从两个不同的表中拉出一列:

select id, max(col1) as col1, max(col2) as col2
from ((select t1.id, t1.col1, NULL as col2
       from t1
      ) union all
      (select t23.id, NULL as col1, t2.col2
       from t2
      )
     ) t
group by id

答案 1 :(得分:0)

我认为线索是“团体订单和公司付款”。将外部联接分解为订单查询和另一个付款查询,然后将每个公司的货币类型(订单或付款)加起来。

相关问题