[英]How to left outer join from two tables to a third table
我有三个表AB和C(最后一个是我想要的结果)
A.id B.age C.id C.age result id age
1 5 1 5 1 5
2 6 2 0 null null
3 7 0 7 null null
4 8 4 8 4 8
5 9 5 9 5 9
我想做一个从A和B到C的外部联接,以便最终得到上面的结果。 如果C中缺少任一列,则应产生null。 如果我进行内部联接:
select a.id, b.age where a.id = c.id and b.age = c.age
我将退回3行。 我仍然想要5行。 我正在使用IBM db2 v9。 我试图找出使用较新的左外部联接语法的方法,但我没有看到它。 我可以看到如何在旧的sybase * =外连接语法中做到这一点,但看不到如何以新的样式来做到这一点。 这有可能吗?
有人建议将每个结果的一半相加。 在我看来,联合只是一团糟,我应该能够从两个表中进行左外部联接。
救命? 谢谢。
你是这个意思吗
SELECT a.id, b.age
FROM a
CROSS JOIN b
LEFT OUTER JOIN c on a.id = c.id AND b.age = c.age
关于是否交叉联接A和B或B是否也保持联接,您的问题尚不清楚:
SELECT a.id, b.age
FROM a
LEFT OUTER JOIN c on a.id = c.id
LEFT OUTER JOIN b on b.age = c.age
还有更多可能的组合...
-- A Dummy table
with A as (
select
2 as id
from
sysibm.sysdummy1)
-- B Dummy table
, B as (
select
6 as age
from
sysibm.sysdummy1)
-- C Dummy table
, C as (
select
2 as id,
0 as age
from
sysibm.sysdummy1)
-- Actual result query
select
A.id as "A.id",
B.age as "B.age",
C.id as "C.id",
C.age as "C.age",
case
when A.id = C.id and B.age = C.age then
C.id
else
null
end as "result id",
case
when A.id = C.id and B.age = C.age then
C.age
else
null
end as "result age"
from
sysibm.sysdummy1 as Dummy
left outer join A as A on 1=1
left outer join B as B on 1=1
left outer join C as C on 1=1
这是我的解决方案,它将产生与原始帖子匹配的结果。 只需使用提供的示例交换A,B和C虚拟表中的值。
编辑:不使用case语句的相同结果:
select
A.id as "A.id",
B.age as "B.age",
C.id as "C.id",
C.age as "C.age",
R.id as "result id",
R.age as "result age"
from
sysibm.sysdummy1 as Dummy
left outer join A as A on 1=1
left outer join B as B on 1=1
left outer join C as C on 1=1
left outer join C as R
on A.id = R.id
and B.age = R.age
这是对此问题的最新回复,但下面的查询应该可以解决。
我已经在http://sqlfiddle.com/#!3/07d74/5创建了一个在线sqlfiddle
您可以使用上面的在线sqlfiddle验证您的要求。 它给出的结果与您要求的完全相同。
即使经过大量的搜索,我仍然找不到用于运行DB2查询的在线工具,但是在提出此查询之前,我检查了IBM关于DB2语法的文档以进行交叉联接和左联接。 因此,它应该在DB2中工作,但是如果您发现任何问题,请告诉我。 如果您知道DB2的在线工具,请告诉我。 sqlfiddle基于Sql Server,因为sqlfiddle上没有针对DB2的选项,但是就像我说的那样,根据我阅读的文档,该查询与DB2兼容。
DB2兼容查询如下。
SELECT D.id,
D.age
FROM C
LEFT OUTER JOIN
(SELECT A.id,
B.age
FROM A
CROSS JOIN B) D ON D.id = C.id
AND D.age = C.age;
对不起,“ FULL JOIN”帖子不完整和不正确。
不是吗:
select case when b.age is not null then a.id end as id
, case when a.id is not null then b.age end as age
from c
left join a on a.id = c.id
left join b on b.age = c.age
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.