SQL-запрос для определения некоторых из трех полей из трех разных таблиц

0

У меня есть три таблицы: tableA (id, A), tableB (id, B) и tableC (id, C). id - уникальный и первичный ключ. Теперь я хочу запустить запрос в этих трех таблицах, чтобы узнать сумму значений A, B и C для каждого id. (то есть, если id1 присутствует в таблице A, но не в таблице B, тогда значение B должно считаться 0 для id 1). Например: tableA:

id  A
1   5
2   6
3   2
5   7

TableB:

id  B
2   5
3   8
4   1

tableC:

id  C
5   2

вывод должен быть:

id  Sum
1   (5 + 0 + 0 =)5
2   (6 + 5 + 0 =)11
3   (2 + 8 + 0 =)10
4   (0 + 1 + 0 =)1
5   (7 + 0 + 2 =)9
  • 0
    Для большей ясности предлагаем изменить название вопроса на «SQL-запрос, чтобы узнать сумму трех полей из трех разных таблиц».
Теги:
database

4 ответа

1
Лучший ответ

Сначала получите отдельный список (UNION) идентификаторов, чтобы вы включили все, а затем LEFT JOIN, чтобы добавить значения вместе.

Что-то вроде

SELECT  IDs.ID,
         IFNULL(tableA.A,0) + IFNULL(tableB.B,0) + IFNULL(tableC.C,0) SumVal
FROM    (
            SELECT  ID
            FROM    tableA
            UNION
            SELECT  ID
            FROM    tableB
            UNION
            SELECT  ID
            FROM    tableC
        ) IDs LEFT JOIN
        tableA ON IDs.ID = tableA.ID LEFT JOIN
        tableB ON IDs.ID = tableB.ID LEFT JOIN
        tableC ON IDs.ID = tableC.ID
  • 0
    Не отрицательное голосование, но не слишком ли это сложно по сравнению с другими ответами?
1

Не уверен в точном синтаксисе MySQL, но это работает в SQL Server:

SELECT ID, SUM(ColToSum) As SumValue FROM
(
SELECT ID, A As ColToSum FROM TableA
UNION ALL
SELECT ID, B As ColToSum FROM TableB
UNION ALL
SELECT ID, C As ColToSum FROM TableC
) Combined
GROUP BY ID

Не забудьте использовать "UNION ALL", а не просто "UNION", который удаляет повторяющиеся строки по мере их объединения (см. http://dev.mysql.com/doc/refman/5.0/en/union.html)

1

Я не смог проверить его с помощью MySql, но это работает с моими базами данных (HSQLDB, Oracle):

select ID, sum(X) from 
  (SELECT  ID, A as X FROM    tableA
   UNION
   SELECT  ID, B as X FROM    tableB
   UNION
   SELECT  ID, C as X FROM    tableC)
group by ID
1

Что-то вроде этого должно работать:

select id, sum(val) from
( select id, "A" as val from "tableA"
  union all
  select id, "B" as val from "tableB"
  union all
  select id, "C" as val from "tableC" ) as joined
group by id
order by id
  • 0
    Я не думаю, что "A" / "tableA" / "B" / "tableB" / "C" / "tableC" должны быть в кавычках. Они не текстовые литералы.
  • 0
    Что ж, хорошей практикой является их включение, если вы используете postgresql (моя предпочтительная база данных), хотя они нужны только тогда, когда 1. у вас есть имена столбцов или таблиц, которые будут зарезервированными ключевыми словами в PG или 2. (более часто) при использовании такие символы, как подчеркивание в именах таблиц или столбцов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню