Я предполагаю, что вы правы, что ЕДИНСТВЕННАЯ проблема в том случае, когда объединение на table1_2 вызывает дублирование.
В этом случае сначала объедините эту таблицу, прежде чем присоединять к ней.
select
sum(table1.quantity) as t1q,
sum(table1_2.quantity) as t2q,
sum(table3.quantity) as t3q,
table1.pid as pid
from
table1
inner join
table3
on table1.pid=table3.pid
inner join
(
SELECT
pid,
SUM(quantity) AS quantity
FROM
table1
WHERE
from_id = 10
GROUP BY
pid
)
table1_2
on table1.pid=table1_2.pid
where
table1.to_id=10 and
table3.some_id=10
group by
pid
Если ваше предположение является неполным, вам может потребоваться сделать это с каждой таблицей ...
select
table1.quantity as t1q,
table1_2.quantity as t2q,
table3.quantity as t3q,
table1.pid as pid
from
(
SELECT
pid,
SUM(quantity) AS quantity
FROM
table1
WHERE
to_id = 10
GROUP BY
pid
)
table1
inner join
(
SELECT
pid,
SUM(quantity) AS quantity
FROM
table3
WHERE
some_id = 10
GROUP BY
pid
)
table3
on table1.pid=table3.pid
inner join
(
SELECT
pid,
SUM(quantity) AS quantity
FROM
table1
WHERE
from_id = 10
GROUP BY
pid
)
table1_2
on table1.pid=table1_2.pid
Без и с примером набора данных для проверки, есть много предположений.
Но, как правило, агрегируйте перед объединением, если вы присоединяетесь к столбцу, который не уникален в этой таблице.
РЕДАКТИРОВАТЬ: Ответ накомментарий
SELECT
COALESCE(table1.t1q, 0) AS t1q,
COALESCE(table1.t2q, 0) AS t2q,
COALESCE(table3.t3q, 0) AS t3q,
COALESCE(table1.pid, table3.pid) AS pid
FROM
(
SELECT
pid,
SUM(CASE WHEN to_id = 10 THEN quantity ELSE 0 END) AS t1q,
SUM(CASE WHEN from_id = 10 THEN quantity ELSE 0 END) AS t2q
FROM
table1
WHERE
to_id = 10
OR from_id = 10
GROUP BY
pid
)
table1
FULL OUTER JOIN
(
SELECT
pid,
SUM(quantity) AS quantity
FROM
table3
WHERE
some_id = 10
GROUP BY
pid
)
table3
ON table1.pid = table3.pid
Или ...
SELECT
SUM(t1q) AS t1q,
SUM(t2q) AS t2q,
SUM(t3q) AS t3q,
pid
FROM
(
SELECT pid, quantity AS t1q, 0 AS t2q, 0 AS t3q FROM table1 WHERE to_id = 10
UNION ALL
SELECT pid, 0 , quantity, 0 FROM table1 WHERE from_id = 10
UNION ALL
SELECT pid, 0 , 0 , quantity FROM table3 WHERE some_id = 10
)
combined
GROUP BY
pid