0

MySQLのFull Outer Joinの代替案を知りたいです。ユニオンを介して実行できることはわかっていますが、要件が少し複雑であるため、機能していません。master(branch_id,purchase_mindate,purchase_billvalue) と transfer(branch_id,tra_gtr_date,tra_travalue) の 2 つのテーブルがあり、両方の id フィールドがほぼ同じになります。次に、2 つのテーブルを条件で結合して、値id,sum(billvalue),sum(travalue)を取得する必要があります

  1. Mindate=現在の日付
  2. Gtrdate=現在の日付
  3. マスターのテーブルに値がなく、転送テーブルに値が含まれている場合、転送の値を含める必要があります
  4. マスターのテーブルに値が含まれているが転送に含まれていない場合、マスターの値を表示する必要があります。

ユニオン、ジョインなどを試しましたが、どこかで何か間違ったことをしていることはわかっていますが、これを手伝ってください。

以下のクエリを使用しました。

select purchase_master.branch_id, sum(purchase_billvalue) as billvalue, sum(tra_value) as travalue 

from purchase_master 
join purchase_transfer on purchase_master.branch_id=purchase_transfer.branch_id 
where purchase_mindate=CURDATE() and tra_gtr_date=CURDATE() 
group by branch_id

2 つのテーブルに現在の日付が含まれている場合にのみ値を取得しますが、1 つのテーブルに含まれていて他のテーブルに含まれていない場合は値を取得しません

テーブルのスクリーンショットを添付しました。

  1. マスターテーブル転送テーブル マスターテーブル

  2. 転送テーブル

以下のクエリを試しましたが、結果は空です。

select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
left outer join purchase_transfer as pt on pm.branch_id=pt.branch_id
where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()
union
select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
right outer join purchase_transfer as pt on pm.branch_id = pt.branch_id
where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()

結果が sum(billvalue) sum(travalue) group by branch_id として必要です。

  1. 2 つのテーブルに currentdate データが含まれている場合
  2. 現在の日付データが含まれている場合
4

2 に答える 2

3

両方のテーブルが ごとに1行以上あるため、branch_id最初GROUP BY branch_idに (各テーブルで個別に) をエミュレートするFULL JOIN必要があります。UNION ALLGROUP BYLEFTRIGHT

最初の(GROUP BY個別に、次にUNION ALLプラスGROUP BY)方法:

SELECT branch_id, 
       SUM(purchase_billvalue) AS purchase_billvalue, 
       SUM(tra_value) AS tra_value
FROM
  ( SELECT branch_id, 
           SUM(purchase_billvalue) AS purchase_billvalue,
           NULL AS tra_value
    FROM purchase_master
    WHERE purchase_mindate = CURDATE()
    GROUP BY branch_id
  UNION ALL
    SELECT branch_id, 
           NULL, 
           SUM(tra_value)
    FROM purchase_transfer  
    WHERE tra_gtr_date = CURDATE()
    GROUP BY branch_id
) AS u
GROUP BY branch_id ;

これを行う 3 番目の方法 - 最も効率的な方法かもしれません (ただし、テストを行います!) は、@peterm の回答で提供されています。最初にUNION(not ) を実行して、両方のテーブルとUNION ALL異なるすべてを見つけてから、別々に実行された派生テーブルに 2 つの結合を実行します。branch_idLEFTGROUP BY branch_id

于 2013-09-08T08:43:39.333 に答える