Database SQL查询以从三个不同的表中找出三个字段中的某些字段

Database SQL查询以从三个不同的表中找出三个字段中的某些字段,database,mysql,Database,Mysql,我有三个表,表A(id,A),表B(id,B)和表C(id,C)。id是唯一的主键。现在,我想在这三个表上运行一个查询,找出每个id的a、B和C值之和(即,如果表a中存在id 1,但表B中不存在id 1,则id 1的值B应视为0)。示例:表a: id A 1 5 2 6 3 2 5 7 表B: id B 2 5 3 8 4 1 表C: id C 5 2 输出应为: id Sum 1 (5 + 0 + 0 =)5 2 (6 + 5 + 0 =)

我有三个表,表A(id,A),表B(id,B)和表C(id,C)。id是唯一的主键。现在,我想在这三个表上运行一个查询,找出每个id的a、B和C值之和(即,如果表a中存在id 1,但表B中不存在id 1,则id 1的值B应视为0)。示例:表a:

id  A
1   5
2   6
3   2
5   7
表B:

id  B
2   5
3   8
4   1
表C:

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
首先获取ID的不同列表(并集),以便包含所有ID,然后左连接将这些值添加到一起

差不多

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
首先获取ID的不同列表(并集),以便包含所有ID,然后左连接将这些值添加到一起

差不多

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

像这样的方法应该会奏效:

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

像这样的方法应该会奏效:

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

我无法使用MySql进行测试,但这可以用于我的数据库(HSQLDB、Oracle):


我无法使用MySql进行测试,但这可以用于我的数据库(HSQLDB、Oracle):


不确定确切的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”,它在合并时去掉重复的行(请参见)

不确定确切的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”,它在合并时去掉重复的行(请参见)

而不是向下投票,但是与其他答案相比这不是太复杂吗?不是向下投票,但与其他答案相比这不是太复杂吗?我不认为“A”/“tableA”/“B”/“tableB”/“C”/“tableC”应该用引号引起来。它们不是文本文本。如果您使用postgresql(我选择的数据库),那么最好将它们包括在内,尽管它们仅在1时才需要。您的列名或表名将作为PG或2中的保留关键字。(更常见)在表或列名中使用下划线等字符时。我认为“A”/“tableA”/“B”/“tableB”/“C”/“tableC”不应在引号中。它们不是文本文本。如果您使用postgresql(我选择的数据库),那么最好将它们包括在内,尽管它们仅在1时才需要。您的列名或表名将作为PG或2中的保留关键字。(更常见)在表名或列名中使用下划线等字符时。建议您将问题标题更改为“SQL查询以查找三个不同表中三个字段的总和”,以提高清晰度。建议您将问题标题更改为“SQL查询以查找三个不同表中三个字段的总和”,以提高清晰度。