Oracle连接表并始终包含所有可能的结果

时间:2015-08-18 00:05:08

标签: oracle join

我正在尝试连接两个如下所示的表:

Table 1

Letter | Value
   A       2
   B       5


Table 2

Letter | Number
   A       1
   C       7

我正在尝试加入这些表,这样,无论表中的内容是什么,结果中总会有A,B,C记录。换句话说,这将显示:

Letter | Value | Number
   A       2       1
   B       5      null
   C      null     7

无论是否在表格中,都应始终显示三个字母的记录。所以假设table2看起来像这样:

Letter | Number
   A       1

然后我想要以下结果,即使现在没有' C'记录:

Letter | Value | Number
   A       2       1
   B       5      null
   C      null    null

有人能说明怎么做吗?

2 个答案:

答案 0 :(得分:2)

您可以使用带有SELECT ... FROM DUAL子句的CONNECT BY来生成一组稳定的字母,以防某些字母出现在任何一个表格中。

with base_set_of_letters as (
  select chr(rownum + 64) as Letter -- ascii 65=A, 66=B, 67=C, ...
  from dual
  connect by rownum <= 3) -- increase this number if you want more letters
select l.letter, t1.value, t2.xNumber
  from base_set_of_letters l
  left join Table1 t1 on t1.letter = l.letter
  left join Table2 t2 on t2.letter = l.letter
order by l.letter;

SQL Fiddle Demo

答案 1 :(得分:0)

如果您只是希望获得所有已加入的行,无论关系的两侧是否存在数据,您都在寻找一个完整的外部联接:

SELECT COALESCE(t1.LETTER, t2.LETTER) AS LETTER,
       t1.VALUE,
       t2.NUM
  FROM TABLE_1 t1
  FULL OUTER JOIN TABLE_2 t2
    ON t2.LETTER = t1.LETTER
  ORDER BY COALESCE(t1.LETTER, t2.LETTER);

产生

LETTER  VALUE   NUM
A       2       1
B       5       (null)
C       (null)  7

但是,这只会为您提供有关键值的行(&#39; A&#39;,&#39; B&#39;或&#39; C&#39;) - 但是,如果有人失踪,你什么也得不到。 IMO你需要一个第三个表,可能叫做ALPHABET,包含所有可能的字母:

CREATE TABLE ALPHABET (LETTER  CHAR(1));

并填充了&#39; A&#39;,&#39; B&#39; C&#39;等等。在这种情况下,您的加入将成为:

SELECT a.LETTER,
       t1.VALUE,
       t2.NUM
  FROM ALPHABET a
  FULL OUTER JOIN TABLE_1 t1
    ON t1.LETTER = a.LETTER
  FULL OUTER JOIN TABLE_2 t2
    ON t2.LETTER = a.LETTER

如果ALPHABET仅填充了(&#39; A,&#39; B&#39;,&#39; C&#39;和&#39; D&#39;),则产生

LETTER  VALUE    NUM
A       2        1
B       5        (null)
C       (null)   7
D       (null)   (null)

SQLFiddle here(请注意,在小提琴中,我将变量名称NUMBER更改为NUM,以消除在所使用的任何地方对其进行双重引号的需要。 / p>