将两个查询的结果连接在一起

时间:2021-05-19 07:50:13

标签: sql oracle

我想将这两个查询的结果合并为一个结果。我尝试使用完全外部联接,但出现错误。

select MS.TeamID, count(MS.MemberID) as Number_Of_Members
from MEMBERSHIP MS
where MS.TeamID  in
(select TeamID
from FRANCHISE_APP
where Status ='granted' or Status = 'Granted' or Status ='GRANTED')
group by TeamID;
select T.TeamID, T.TeamName, T.TeamLeaderID
from Team T
where T.TeamID in
(select TeamID
from FRANCHISE_APP
where Status ='granted' or Status = 'Granted' or Status ='GRANTED')
;

想要的结果:

|teamid|teanname |leadername|numberofmembers|
|------| ------- | -------- |---------------|
|T1    | TI      |  Justin  |4              |
|T2    | MT      |  Danny   |3              |

2 个答案:

答案 0 :(得分:0)

基于所提供的有限信息;对以下 SQL 的一些更改应该可以工作。

With A as (
  select 
    MS.TeamID, 
    count(MS.MemberID) as Number_Of_Members 
  from 
    MEMBERSHIP MS 
  where 
    MS.TeamID in (
      select 
        TeamID 
      from 
        FRANCHISE_APP 
      where 
        Status = 'granted' 
        or Status = 'Granted' 
        or Status = 'GRANTED'
    ) 
  group by 
    TeamID
), 
B as (
  select 
    T.TeamID, 
    T.TeamName, 
    T.TeamLeaderID 
  from 
    Team T 
  where 
    T.TeamID in (
      select 
        TeamID 
      from 
        FRANCHISE_APP 
      where 
        Status = 'granted' 
        or Status = 'Granted' 
        or Status = 'GRANTED'
    )
) 
Select 
  A.teamID, 
  B.teamname, 
  B.TeamLeaderID, 
  A.Number_Of_Members 
from 
  A, 
  B 
where 
  a.teamID = B.teamId;

答案 1 :(得分:0)

加入这两个查询相当简单:

select coalesce(t.teamid, t.teamid) as teamid,
  t.teamname,
  t.teamleaderid,
  m.number_of_members
from (<query 1>) m
full outer join (<query 2>) t
on t.teamid = m.teamid;

包含您的查询的是:

select coalesce(t.teamid, t.teamid) as teamid,
  t.teamname,
  t.teamleaderid,
  m.number_of_members
from (
  select MS.TeamID, count(MS.MemberID) as Number_Of_Members
  from MEMBERSHIP MS
  where MS.TeamID  in
  (select TeamID
  from FRANCHISE_APP
  where Status ='granted' or Status = 'Granted' or Status ='GRANTED')
  group by TeamID
) m
full outer join (
select T.TeamID, T.TeamName, T.TeamLeaderID
from Team T
where T.TeamID in
(select TeamID
from FRANCHISE_APP
where Status ='granted' or Status = 'Granted' or Status ='GRANTED')
) t
on t.teamid = m.teamid;

我使用了coalesce,因为对于一个完整的外连接,两个团队ID 都可能为空,所以你想显示哪个不是。

<块引用>

可以在一个查询中完成吗?

两个查询都引用 franchise_app - 这可以通过连接而不是 in() 完成 - 因此您可以将其用作初始表,然后将外部连接保留到其他两个表:

select fa.teamid, t.teamname, t.teamleaderid, count(m.memberid) as number_of_members
from franchise_app fa
left join team t on t.teamid = fa.teamid
left join membership m on m.teamid = fa.teamid
where upper(fa.status) = 'GRANTED'
group by fa.teamid, t.teamname, t.teamleaderid
order by fa.teamid;

您似乎总是有一个团队行,因此这可能是一个内部联接,但您可能不知道。

db<>fiddle 用一些虚构的数据来得到你想要的结果;这两个查询都得到:

TEAMID TEAMNAME TEAMLEADERID NUMBER_OF_MEMBERS
------ -------- ------------ -----------------
T1     TI       Justin                       4
T2     MI       Danny                        3

我还更改了状态检查以查找“granted”大写的任何变化;尽管使用函数会阻止使用该列的索引。但是,具有不同的大小写表明存在数据模型问题 - 应该限制允许的值,通过与列出它们的另一个表的关系的约束。但这是一个单独的问题...