0

TOAD for Oracle を使用しています。いくつかの SQL クエリを実装しているときに、次の問題が発生しました。

私は、それぞれが約持っているいくつかのテーブルを使用しています。選択クエリの場合は 1,000 万行。2 つのテーブルに 7,000 万行を超えるデータがあります。

私が持っているとしましょう。

TRANSACTION テーブル (基本キー: SQ_TRANSACTION_ID)

TRANSACTION_DETAIL テーブル (外部キー: RF_TRANSACTION_ID、RF_PRODUCT_ID)

PRODUCT テーブル (基本キー: SQ_PRODUCT_ID)

私の選択クエリは次のようなものです。

SELECT TR.TRANSACTION_ID,
       SUM(CASE WHEN PR.CD_PRODCUT_TYPE = 'A' 
                THEN TRD.CS_INVOICE_PRICE ELSE 0 END) A_PRODUCT_TOTAL,
       SUM(CASE WHEN PR.CD_PRODCUT_TYPE <> 'A'
                THEN TRD.CS_INVOICE_PRICE ELSE 0 END) B_PRODUCT_TOTAL
  FROM TRANSACTION TR,
       TRANSACTION_DETAIL TRD,
       PRODUCT PR
 WHERE TR.SQ_TRANSACTION_ID = TRD.RF_TRANSACTION_ID
   AND TRD.RF_PRODUCT_ID = PR.SQ_PRODUCT_ID
 GROUP BY TR.TRANSACTION_ID,
       CASE WHEN PR.CD_PRODCUT_TYPE = 'A' THEN TRD.CS_INVOICE_PRICE ELSE 0 END,
       CASE WHEN PR.CD_PRODCUT_TYPE <> 'A' THEN TRD.CS_INVOICE_PRICE ELSE 0 END

外部/主キーを使用して、このクエリを互いに参照する 2 つ以上の部分に分割する方法はありますか? つまり、最初の部分が A_PRODUCT_TOTAL をフェッチし、2 番目の部分が B_PRODUCT_TOTAL をフェッチする 2 つの部分に分割するようなものです。各パーツのトランザクション ID は、結果データで一致する必要があります。

4

1 に答える 1

0

クエリの直訳は次のようになります。

SELECT TR.TRANSACTION_ID, SUM(TRD.CS_INVOICE_PRICE) A_PRODUCT_TOTAL
  FROM TRANSACTION TR join
       TRANSACTION_DETAIL TRD
       on TR.SQ_TRANSACTION_ID = TRD.RF_TRANSACTION_ID join
       PRODUCT PR
       on TRD.RF_PRODUCT_ID = PR.SQ_PRODUCT_ID
 WHERE PR.CD_PRODCUT_TYPE = 'A' 
 GROUP BY TR.TRANSACTION_ID,
       CASE WHEN PR.CD_PRODCUT_TYPE = 'A' THEN TRD.CS_INVOICE_PRICE ELSE 0 END

group byただし、請求書の価格が同じ場合、各トランザクションが reow に分割されるため、 の 2 番目の句は必要ないのではないかと思います。

SELECT TR.TRANSACTION_ID, SUM(TRD.CS_INVOICE_PRICE) A_PRODUCT_TOTAL
  FROM TRANSACTION TR join
       TRANSACTION_DETAIL TRD
       on TR.SQ_TRANSACTION_ID = TRD.RF_TRANSACTION_ID join
       PRODUCT PR
       on TRD.RF_PRODUCT_ID = PR.SQ_PRODUCT_ID
 WHERE PR.CD_PRODCUT_TYPE = 'A' 
 GROUP BY TR.TRANSACTION_ID;

のクエリ'B'も同様です。

于 2013-09-15T20:47:06.403 に答える