我需要得到两个几乎相同的子查询的结果,我想知道是否有办法做到这一点而没有两次执行子查询的低效率。
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秒。我没想到这个结果。
为什么单个子查询会变慢?也许这应该是一个单独的问题......
答案 0 :(得分:2)
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
答案 1 :(得分:0)
我可以找出这个查询表单:
SELECT DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
(SELECT
ROUND(SUM(lienBills.amount), 2) AS totalBill,
ROUND(SUM(lienBills.amount), 2) - lienSettlementAmount AS savings
FROM lienBills2Lien LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID)
FROM events RIGHT JOIN liens ON events.childID = liens.lienID WHERE events.fileNumber = 14275 AND events.eventTypeID = 79;
在这里你只有一个子查询。我真的很想知道你是否得到了同样需要的结果。
此致