Sql 为什么外部联接查询不起作用?

Sql 为什么外部联接查询不起作用?,sql,join,Sql,Join,你好, 我的目标是生成一个表,显示属于所有者的每个代码的总数,请注意,无论总值为零,每个所有者都必须有一个与其关联的代码。因此,将有应用程序REJ与每个批准ID绑定 APPROVAL_ID CODE TOTAL ----------- ---- ----- 101 APP 2 101 REJ 1 101 CAN 3 102 APP 2 102 REJ 4 102

你好, 我的目标是生成一个表,显示属于所有者的每个代码的总数,请注意,无论总值为零,每个所有者都必须有一个与其关联的代码。因此,将有应用程序REJ与每个批准ID绑定

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
102          CAN   0
103          APP   0
103          REJ   0
103          CAN   4
因此,以下是源代码:

select approval_id, code, total
from (
  select 'APP' code, '1' seq from dual
  union all
  select 'REJ' code, '2' seq from dual
  union all
  select 'CAN' code, '3' seq from dual
)
left outer join (
      select m.approval_id, own.name, m.decision, count(*) total, 
      case own.channel
          when 'CH1' then 'CH1'
          when 'CH2' then 'CH2'
          else 'Others Channel'
      end the_channel
      from tableM m, owner own
      where m.decision in ('REJ', 'APP', 'CAN')
      and own.id=m.approval_id
      group by m.approval_id, own.name, m.decision, own.channel
      order by m.approval_id
)
on code=decision
group by approval_id, code, total
order by approval_id;
上述查询的输出如下所示:

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4
APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4
内部查询的输出如下所示:

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4
APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4
查询有点不对劲,因为我知道某些行的总值为零,它应该在其中打印null值之类的内容。但为什么它被隐藏在视线之外呢?我的问题有什么不对吗


谢谢!

您的外部联接取决于code=decision。这意味着您可以为每个代码获得一行,而这些代码不会作为右侧的决策出现。显然,您希望通过3个代码和所有不同的批准ID的交叉连接来执行左侧连接,在左侧提供所有代码和批准ID的组合。

首先,您需要在所有者和代码表之间执行交叉连接。 然后你做左连接

我对3个表进行了建模:输入3行应用程序、REJ和CAN,然后是一个用户表,相当于您的所有者表,以及第三个决策表,相当于您的表M

查询如下所示:

SELECT c.user_id, c.type_code, COUNT(d.id)
FROM
(

    SELECT t.ID as type_id, u.id as user_id, t.CODE as type_code
    FROM Type t, Userr u
) c 
    LEFT OUTER JOIN Decision d 
            ON d.user_id = c.user_id
            AND d.type_id = c.type_id
GROUP BY c.user_id, c.type_code
未测试,但适用于您的一套表格:

select a.id_own, a.code, count(m.approval_id)
from
    (
        select code, own.id as id_own
        from (
          select 'APP' code, '1' seq from dual
          union all
          select 'REJ' code, '2' seq from dual
          union all
          select 'CAN' code, '3' seq from dual
        ) , owner own
    ) a
    left outer join tableM m
on a.code = m.decision
and a.id_own = m.approval_id
group by a.id_own, a.code
order by a.id_own
请注意,countm.approval\u id将为您提供在左侧联接中显示为非空的approval\u id的编号。

我的第一个猜测是

group by approval_id, code, total
应该是

group by approval_id, code

内部查询返回什么?选择m.approval\u id、own.name、m.decision、count*total、case own.channel当“CH1”时选择“CH1”当“CH2”时选择“CH1”当“CH2”时选择“CH2”其他“其他”通道结束表中的m.approval\u通道、owner own where m.decision在“REJ”、“APP”、“CAN”和own.id=m.approval\u id按m.approval\u id分组,staff.staff\u name、m.decision、own.channel order by m.approval\u id@forsvarir I已添加内部查询的输出。它与父输出完全相同。内部查询中的staff.staff\u name是什么?@Chris Bednarski感谢您提醒我输入错误,它是own.name,不是staff.staff\u name。您的算法太完美了!!我从你那里学到了新技术:0