0

TRANSACTIONSという名前の3 つのテーブルがあるORDERSPAYMENTSしますTRANSACTION_ID

これは、5 つの注文と 3 つの支払いがあるトランザクションに参加したときに得られる通常の出力です。

transaction_id, order_id, payment_id
----------
1, 20, 35
1, 20, 36
1, 20, 37
1, 21, 35
1, 21, 36
1, 21, 37
....

私が得るべきものは次のとおりです。

transaction_id, order_id, payment_id
----------
1, 20, 35
1, 21, 36
1, 22, 37
1, 23, null
1, 24, null

注文よりも多くの支払いがある場合はNULLorder_id列に表示されます。

基本的に、 /transaction_idのカウントのより大きな数に等しい行数が必要です(この例では 5 > 3 なので 5)。orderspayments

これらの各テーブルには数百万のレコードがあることに注意してください。

編集

コメントでのリクエストにより、上記のクエリは単純な結合です

SELECT t.transaction_id, o.order_id, p.payment_id
FROM TRANSACTION t
LEFT JOIN ORDERS o on o.transaction_id = t.transaction_id
LEFT JOIN PAYMENTS p on p.transaction_id = o.transaction_id

編集2

完全なテーブル スキームを開示することはできません。クエリが機能するために必要な列のみを記述しました。実際には、これらのテーブルにはすべて 20 列以上あり、クエリは合計で約 20 列を返す必要があります。繰り返しになりますが、1 億TRANSACTIONS件を超えるレコードがあり、両方ともORDERS15万件以上PAYMENTSのレコードがあり、そのうち約 10 万件のレコードを返す必要があります。

4

2 に答える 2

1

両方の結果を結合し、以下のように行をチェックする必要があります:

select transaction_id, sum(order_id) as order_id, sum(payment_id) as payment_id
from
(
    SELECT t.transaction_id, 
           ROW_NUMBER() OVER (PARTITION BY t.transaction_id ORDER BY order_id) RowNo, 
           o.order_id, 
           null as payment_id
    FROM TRANSACTIONS t
    LEFT JOIN ORDERS o on o.transaction_id = t.transaction_id

    union 

    SELECT t.transaction_id, 
           ROW_NUMBER() OVER (PARTITION BY t.transaction_id ORDER BY payment_id) RowNo, 
           null as order_id, 
           p.payment_id
    FROM TRANSACTIONS t
    LEFT JOIN Payments p on p.transaction_id = t.transaction_id
) tt
group by transaction_id, RowNo

SQL Fiddle デモ: http://sqlfiddle.com/#!3/e991d/21

アップデート :

以下のように UNION の代わりに JOIN で試してみてください:

SELECT t1.transaction_id, t1.order_id, t2.payment_id
from   
(
  SELECT t.transaction_id, 
         ROW_NUMBER() OVER (PARTITION BY t.transaction_id ORDER BY order_id) RowNo,
         o.order_id
  FROM TRANSACTIONS t
  LEFT JOIN ORDERS o on o.transaction_id = t.transaction_id
) t1
full join 
(
  SELECT t.transaction_id, 
         ROW_NUMBER() OVER (PARTITION BY t.transaction_id ORDER BY p.payment_id) RowNo,
         p.payment_id
  FROM TRANSACTIONS t
  LEFT JOIN Payments p on p.transaction_id = t.transaction_id
  ) t2
on t1.transaction_id = t2.transaction_id and t1.RowNo = t2.RowNo

SQL フィドルのデモ: http://sqlfiddle.com/#!3/e991d/20

于 2013-11-15T11:43:28.410 に答える