繁体   English   中英

如何将外部联接从两个表移到第三个表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM