-4

mysqlで完全外部結合が必要です。ここで解決策を見つけました:MySQLの完全外部結合私の問題は、t1とt2自体がサブクエリであるということです。したがって、結果のクエリはモンスターのように見えます。この状況で何をしますか?サブクエリの代わりにビューを使用する必要がありますか?

編集: もう少し説明しようと思います。注文と支払いがあります。1回の支払いで複数の注文を処理でき、1回の支払いで複数の支払いを処理できます。そのため、テーブルの注文、支払い、および支払いアイテムがあります。各注文には、フィールド会社(この注文を行った)とマネージャー(この注文を受け入れた)があります。次に、会社とマネージャーごとに注文と支払いをグループ化し、お金を数える必要があります。だから私はこのようなものを手に入れたい:

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 の場合は、and 集約を使用して同じことを達成できますunion

以下は、2 つの異なるテーブルから 1 つの列を取得する例です。

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 に答える