我正在尝试连接两个如下所示的表:
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
有人能说明怎么做吗?
答案 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;
答案 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>