-4

我需要一个完整的外部连接在 mysql 中。我在这里找到了一个解决方案: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)))

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

4

2 回答 2

0

如果您尝试进行完全外连接并且关系是 1-1,那么您可以使用 aunion和聚合来完成同样的事情。

这是一个示例,从两个不同的表中提取一列:

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
于 2013-03-22T15:13:39.873 回答
0

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

于 2013-03-29T17:43:29.583 回答