我有一个“交易”表。
交易可以有多个“TransactionProduct”。
交易产品可以有多个“PriceModifiers”。
我有一个查询,它返回每个交易产品的总价格修饰符(减少金额)。
查询:
SELECT
TRANSACTION.DESCRIPTION,
TRANSACTIONPRODUCT.PRODUCTNAME,
TRANSACTIONPRODUCT.EFFECTIVEPRICE,
(
SELECT SUM(AMOUNT)
FROM PRICEMODIFIER
WHERE TRANSACTIONPRODUCTID = TRANSACTIONPRODUCT.TRANSACTIONPRODUCTID
)
AS REDUCTIONAMOUNT
FROM
TRANSACTION,
TRANSACTIONPRODUCT
WHERE
TRANSACTION.TRANSACTIONID = TRANSACTIONPRODUCT.TRANSACTIONID
如果我使用Sum删除子查询,则查询执行速度非常快。
使用子查询,需要几秒钟......
知道如何改进查询吗?
答案 0 :(得分:3)
您应该学会使用正确的显式JOIN
语法。简单规则:从不在FROM
子句中使用逗号。 始终使用正确的JOIN
语法。
但这与您的性能问题无关。为此,您需要PRICEMODIER(TRANSACTIONPRODUCTID, AMOUNT)
上的索引。
答案 1 :(得分:1)
试试这个:
SELECT
T.DESCRIPTION,
TP.PRODUCTNAME,
TP.EFFECTIVEPRICE,
SUM(PM.AMOUNT)
FROM
TRANSACTION T
JOIN TRANSACTIONPRODUCT TP
ON T.TRANSACTIONID = TP.TRANSACTIONID
JOIN PRICEMODIFIER PM
ON PM.TRANSACTIONPRODUCTID = TP.TRANSACTIONPRODUCTID
GROUP BY T.DESCRIPTION, TP.PRODUCTNAME, TP.EFFECTIVEPRICE