Я думаю, что у вас достаточно ответов, подсказывающих, как правильно решить вашу проблему. Вы также получили ответ @ araqnid, который поможет вам понять, почему вы в итоге получаете такие результаты. Похоже, мне остается только объяснить само поведение в соответствии с вашей просьбой.
По сути, причина такого поведения заключается в том, что второе соединение выполняется не tbltype
и tblvalue
, как можно подумать, а в результате объединения между tbltype
и tblcost
с одной стороны, и стол tblvalue
, с другой. Теперь при первом объединении создаются дубликаты t.id
, поскольку они соответствуют второй таблице более одного раза:
tbltype tblcost
id type id cost typeid t.id t.type c.id c.cost c.typeid
-- ---- × -- ---- ------ = ---- ------ ---- ------ --------
1 aaa 1 5 1 1 aaa 1 5 1
1 bbb 2 3 1 1 aaa 2 3 1
3 1 2 2 bbb 3 1 2
4 4 2 2 bbb 4 4 2
Второе объединение создает больше дубликатов, потому что:
- каждое вхождение
t.id
из набора результатов первого объединения сопоставляется с v.typeid
и
- значения
typeid
в таблице tblvalue
также дублируются.
В результате строки из tblcost
и tblvalue
дублируются в процессе:
tblvalue
t.id t.type c.id c.cost c.typeid id val typeid
---- ------ ---- ------ -------- -- --- ------
1 aaa 1 5 1 × 1 3 1 =
1 aaa 2 3 1 2 2 1
2 bbb 3 1 2 3 2 2
2 bbb 4 4 2 4 1 2
t.id t.type c.id c.cost c.typeid v.id v.val v.typeid
---- ------ ---- ------ -------- ---- ----- --------
1 aaa 1 5 1 1 3 1
1 aaa 1 5 1 2 2 1
= 1 aaa 2 3 1 1 3 1
1 aaa 2 3 1 2 2 1
2 bbb 3 1 2 3 2 2
2 bbb 3 1 2 4 1 2
2 bbb 4 4 2 3 2 2
2 bbb 4 4 2 4 1 2
Единственным выходом для вас, похоже, является агрегирование каждой таблицы отдельно. Это не обязательно подразумевает отдельные запросы, просто отдельные sub запросы, как теперь видно из ответов.