Database SQL查询以从三个不同的表中找出三个字段中的某些字段
我有三个表,表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: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 =)
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查询以查找三个不同表中三个字段的总和”,以提高清晰度。