0

我正在为 Oracle 使用 TOAD。当我实现一些 sql 查询时,我遇到了这些问题:

我正在使用几张桌子,每张桌子都有大约。选择查询的 10M 行。2 个表有超过 70M 行数据。

假设我有;

一个 TRANSACTION 表(主键:SQ_TRANSACTION_ID)

一个 TRANSACTION_DETAIL 表(外键:RF_TRANSACTION_ID、RF_PRODUCT_ID)

产品表(主键: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

有没有办法通过使用它们的外键/主键将这个查询分成两个或多个相互引用的部分?我的意思是分成两部分,第一部分获取 A_PRODUCT_TOTAL,第二部分获取 B_PRODUCT_TOTAL。每个部分的事务 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,因为每笔交易都会被拆分为发票价格相同的 reows:

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 回答