С table_b.a1 является уникальной, лучшим способом сделать это было бы отработать сумму table_a.a2 первыми, чтобы уменьшить количество строк, вы присоединяетесь к , а затем присоединитесь к таблице_b. Тогда вам не нужно беспокоиться о суммировании различных значений table_b.b2, которые вам в противном случае пришлось бы делать.
WITH table_a AS (SELECT 1 a1, 7 a2 FROM dual UNION ALL
SELECT 2 a1, 8 a2 FROM dual UNION ALL
SELECT 1 a1, 9 a2 FROM dual),
table_b AS (SELECT 1 a1, 2 b2 FROM dual UNION ALL
SELECT 2 a1, 3 b2 FROM dual)
-- end of mimicking your two tables with sample_data in them;
-- see the sql below:
SELECT ta.a1,
ta.a2,
tb.b2
FROM (SELECT a1, SUM(a2) a2
FROM table_a
GROUP BY a1) ta
INNER JOIN table_b tb ON ta.a1 = tb.a1;
A1 A2 B2
---------- ---------- ----------
1 16 2
2 8 3
Если вы абсолютно необходимо соединить две таблицы первого (я не рекомендую, это делает больше работы для базы данных, чтобы сделать), то вы могли бы сделать что-то вроде:
WITH table_a AS (SELECT 1 a1, 7 a2 FROM dual UNION ALL
SELECT 2 a1, 8 a2 FROM dual UNION ALL
SELECT 1 a1, 9 a2 FROM dual),
table_b AS (SELECT 1 a1, 2 b2 FROM dual UNION ALL
SELECT 2 a1, 3 b2 FROM dual)
SELECT ta.a1,
SUM(ta.a2) a2,
MAX(tb.b2) b2
FROM table_a ta
INNER JOIN table_b tb ON ta.a1 = tb.a1
GROUP BY ta.a1;
A1 A2 B2
---------- ---------- ----------
1 16 2
2 8 3
Поскольку для table_a.a2 может быть только одно значение для таблицы table_a.a1, мы можем просто выбрать одно из значений для использования через MAX
(мы могли бы использовать MIN
или SUM(distinct tb.b2)
вместо, fyi).
Каков ваш ожидаемый результат? – Wanderer
is table_b.a1 уникально? – Boneist
Вы используете устаревший синтаксис соединения. Вы вынуждены работать над очень старой версией Oracle, или это просто, что вам была дана очень старая книга? Вместо этого используйте правильные явные ANSI-соединения, если это возможно ('из левого внешнего соединения b на a.a1 = b.a1'). –