Sql 为什么外部联接查询不起作用?
你好, 我的目标是生成一个表,显示属于所有者的每个代码的总数,请注意,无论总值为零,每个所有者都必须有一个与其关联的代码。因此,将有应用程序REJ与每个批准ID绑定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
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