Should work like this:
SELECT w.firstname, w.lastname, derived1.thesum1, derived2.thesum2
FROM whovians w
LEFT JOIN (
SELECT doctornumref, SUM(thevalue) AS thesum1
FROM friends
WHERE doctornumref = 10
AND year = 1968
GROUP BY 1
) AS derived1 ON derived1.doctornumref = w.doctornum
LEFT JOIN (
SELECT doctornumref, SUM(amount) AS thesum2
FROM enemies
WHERE doctornumref = 10
AND year = 1968
GROUP BY 1
) AS derived2 ON derived2.doctornumref = w.doctornum
WHERE w.doctornum = 10
AND w.year = 1968;
In this particular case, since you restrict to the same year
and doctornumref
/ doctornum
in outer query as well as subqueries, and the subquery can only return 0 or 1 rows, you can simplify with lowly correlated subqueries:
SELECT firstname,lastname
, (SELECT SUM(thevalue)
FROM friends
WHERE doctornumref = w.doctornum
AND year = w.year) AS thesum1
, (SELECT SUM(amount)
FROM enemies
WHERE doctornumref = w.doctornum
AND year = w.year) AS thesum2
FROM whovians w
WHERE year = 1968
AND doctornum = 10;
If (year, doctornum)
is not unique in table whovians
, the first form will prevent repeated evaluation of the subqueries and perform better, though.
You can still simplify:
SELECT w.firstname, w.lastname, f.thesum1, e.thesum2
FROM whovians w
LEFT JOIN (
SELECT SUM(thevalue) AS thesum1
FROM friends
WHERE doctornumref = 10
AND year = 1968
) f ON true -- 0 or 1 row in subquery, guaranteed to match
LEFT JOIN (
SELECT SUM(amount) AS thesum2
FROM enemies
WHERE doctornumref = 10
AND year = 1968
) e ON true
WHERE w.doctornum = 10
AND w.year = 1968;