我需要得到两个几乎相同的子查询的结果,并且我想知道是否有一种方法可以在不两次执行子查询的情况下降低效率。
SELECT
DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
(SELECT
ROUND(SUM(lienBills.amount), 2)
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID
) AS totalBill,
(SELECT
ROUND(SUM(lienBills.amount), 2) - lienSettlementAmount
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID
) AS savings
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
WHERE events.fileNumber = 14275
AND events.eventTypeID = 79
唯一的区别是在第二个子查询中减去了lienSettlementAmount。
该查询提供了我所需的确切信息,但感觉不对。似乎应该有更好的方法。
更新:@StanislavL有正确的答案。这是确切的代码:
SELECT
DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
sub.r_sum as totalBill,
sub.r_sum - lienSettlementAmount as savings
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
LEFT JOIN (SELECT lienBills2Lien.lienID,
ROUND(SUM(lienBills.amount), 2) AS r_sum
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
GROUP BY lienBills2Lien.lienID
) sub ON sub.lienID = liens.lienID
WHERE events.fileNumber = 14275
AND events.eventTypeID = 79
但是,单个子查询的执行时间较长。此查询需要0.0205秒。具有两个子查询的矿井需要0.0054秒。我没想到会有这个结果。
为什么单个子查询会更慢?也许这应该是一个单独的问题...
SELECT
DISTINCT(liens.lienID),
sub.r_sum as totalBill,
sub.r_sum-lienSettlementAmount as savings,
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
LEFT JOIN (SELECT lienBills2Lien.lienID
ROUND(SUM(lienBills.amount), 2) as r_sum
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
GROUP BY lienBills2Lien.lienID
) sub ON sub.lienID= liens.lienID
JUst将子查询移至FROM并添加JOIN
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句