SQL:合并两个具有公共列但每个都有自己特定的唯一列的查询结果
SQL: Combining two query results that have a common column but each has its own specific unique column
我正在努力寻找实现我想要实现的目标的正确方法。
所以这就是我所拥有的:
查询 A 给出以下结果:
TrainingID
totalPass
2
5
3
7
4
8
查询 B 给出以下内容
TrainingID
totalFail
2
3
6
7
7
9
我想要的结果如下:
TrainingID
totalPass
totalFail
2
5
3
3
7
Null
4
8
Null
6
Null
7
7
Null
9
我尝试通过将左连接和右连接与联合结合来模拟 MySQL 中的外部连接,但结果并不完全是我想要的,但我能得到的最接近的结果。也许我的主要问题是我不知道一个术语来描述我正在尝试执行的这个操作到底是什么,所以我不知道要搜索什么。
我会使用完全外部联接。这是一个例子:
declare @p table (TrainingID int, totalPass int)
insert into @p
values
(2, 5)
,(3, 7)
,(4, 8)
declare @f table (TrainingID int, totalFail int)
insert into @f
values
(2, 3)
,(6, 7)
,(7, 9)
select TrainingID = COALESCE(p.TrainingID,f.TrainingID)
, totalPass = SUM(p.totalPass)
, totalFail = SUM(f.totalFail)
from @p p
full outer join @f f on p.TrainingID=f.TrainingID
group by COALESCE(p.TrainingID,f.TrainingID)
注意:
COALESCE 是一个取第一个非空值的函数。
Result:
TrainingID totalPass totalFail
2 5 3
3 7 NULL
4 8 NULL
6 NULL 7
7 NULL 9
试试这个
select coalesce(a.trainingId, b.trainingId)
,a.totalPass
,b.totalPass
from (QueryA) a full outer join (queryB) b on (queryA.trainingId = b.trainingId
MySQL 不支持 full join
-- 这正是您想要的。但是您可以使用 union all
轻松完成此操作。但是让我们先使用 CTE 定义您的查询:
with a as (
. . .
),
b as (
. . .
)
select trainingId, a.totalPass, b.totalFail
from a left join
b
using (trainingId)
union all
select trainingId, null, b.totalFail
from b left join
a
using (trainingId)
where a.trainingId is null;
在第一个查询中为 totalFail
添加一个 NULL
列,在第二个查询中为 totalPass
添加一个 NULL
列。
使用 UNION ALL 获取所有行并聚合:
SELECT TrainingID,
MAX(totalPass) AS totalPass,
MAX(totalFail) AS totalFail
FROM (
SELECT TrainingID, totalPass, NULL AS totalFail
FROM QueryA
UNION ALL
SELECT TrainingID, NULL, totalFail
FROM QueryB
) t
GROUP BY TrainingID
查看简化版 demo。
我正在努力寻找实现我想要实现的目标的正确方法。 所以这就是我所拥有的:
查询 A 给出以下结果:
TrainingID | totalPass |
---|---|
2 | 5 |
3 | 7 |
4 | 8 |
查询 B 给出以下内容
TrainingID | totalFail |
---|---|
2 | 3 |
6 | 7 |
7 | 9 |
我想要的结果如下:
TrainingID | totalPass | totalFail |
---|---|---|
2 | 5 | 3 |
3 | 7 | Null |
4 | 8 | Null |
6 | Null | 7 |
7 | Null | 9 |
我尝试通过将左连接和右连接与联合结合来模拟 MySQL 中的外部连接,但结果并不完全是我想要的,但我能得到的最接近的结果。也许我的主要问题是我不知道一个术语来描述我正在尝试执行的这个操作到底是什么,所以我不知道要搜索什么。
我会使用完全外部联接。这是一个例子:
declare @p table (TrainingID int, totalPass int)
insert into @p
values
(2, 5)
,(3, 7)
,(4, 8)
declare @f table (TrainingID int, totalFail int)
insert into @f
values
(2, 3)
,(6, 7)
,(7, 9)
select TrainingID = COALESCE(p.TrainingID,f.TrainingID)
, totalPass = SUM(p.totalPass)
, totalFail = SUM(f.totalFail)
from @p p
full outer join @f f on p.TrainingID=f.TrainingID
group by COALESCE(p.TrainingID,f.TrainingID)
注意: COALESCE 是一个取第一个非空值的函数。
Result:
TrainingID totalPass totalFail
2 5 3
3 7 NULL
4 8 NULL
6 NULL 7
7 NULL 9
试试这个
select coalesce(a.trainingId, b.trainingId)
,a.totalPass
,b.totalPass
from (QueryA) a full outer join (queryB) b on (queryA.trainingId = b.trainingId
MySQL 不支持 full join
-- 这正是您想要的。但是您可以使用 union all
轻松完成此操作。但是让我们先使用 CTE 定义您的查询:
with a as (
. . .
),
b as (
. . .
)
select trainingId, a.totalPass, b.totalFail
from a left join
b
using (trainingId)
union all
select trainingId, null, b.totalFail
from b left join
a
using (trainingId)
where a.trainingId is null;
在第一个查询中为 totalFail
添加一个 NULL
列,在第二个查询中为 totalPass
添加一个 NULL
列。
使用 UNION ALL 获取所有行并聚合:
SELECT TrainingID,
MAX(totalPass) AS totalPass,
MAX(totalFail) AS totalFail
FROM (
SELECT TrainingID, totalPass, NULL AS totalFail
FROM QueryA
UNION ALL
SELECT TrainingID, NULL, totalFail
FROM QueryB
) t
GROUP BY TrainingID
查看简化版 demo。