SQL:组合具有公共列但每个都有自己特定的唯一列的两个查询结果

时间:2021-05-18 14:12:42

标签: mysql sql union

我正在努力寻找实现我想要实现的目标的正确方法。 所以这就是我所拥有的:

查询 A 给了我以下结果:

<头>
培训ID 总通过
2 5
3 7
4 8

查询 B 给了我以下内容

<头>
培训ID 总失败
2 3
6 7
7 9

我想要的结果如下:

<头>
培训ID 总通过 总失败
2 5 3
3 7
4 8
6 7
7 9

我尝试通过将左连接和右连接与联合相结合来模拟 MySQL 中的外连接,但结果不是我想要的,而是我能得到的最接近的结果。也许我的主要问题是我不知道一个术语来描述我正在尝试做的这个操作究竟是什么,所以我不知道要搜索什么。

4 个答案:

答案 0 :(得分:1)

我会使用完整的外连接。下面是一个例子:

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

答案 1 :(得分:1)

在第一个查询中为 NULL 添加一个 totalFail 列,在第二个查询中为 NULL 添加一个 totalPass 列。
使用 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

答案 2 :(得分:0)

试试这个

select coalesce(a.trainingId, b.trainingId)
,a.totalPass
,b.totalPass
from (QueryA) a full outer join (queryB) b on (queryA.trainingId =    b.trainingId

答案 3 :(得分:0)

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;