Oracle SQL在同一个表的多个上选择null

时间:2015-11-30 15:57:19

标签: sql oracle

我对sql很新,而且我一直在尝试运气很少的东西。这是我的情况。我有tableA,它有多个指向另一个tableB的链接:

select * from tableA where id = 1;
+--+---------+---------+---------+
|ID|TABLEB1ID|TABLEB2ID|TABLEB3ID|
+--+---------+---------+---------+
|1 |1        |2        |3        |
+--+---------+---------+---------+

select * from tableB;
+--+----+
|ID|NAME|
+--+----+
|1 |A   |
+--+----+
|2 |B   |
+--+----+
|3 |C   |
+--+----+

现在,我想从每个对应于这3个ID的行中获取值。现在我正在做这样的事情:

select tableA.*, tableB1.name name1, tableB2.name name2, tableB3.name name3
from tableA, tableB tableB1, tableB tableB2, tableB tableB3
where tableA.id = 1 and
      tableA.tableB1id = tableB1.id and
      tableA.tableB2id = tableB2.id and
      tableA.tableB3id = tableB3.id;
+--+---------+---------+---------+-----+-----+-----+
|ID|TABLEB1ID|TABLEB2ID|TABLEB3ID|NAME1|NAME2|NAME3|
+--+---------+---------+---------+-----+-----+-----+
|1 |1        |2        |3        |A    |B    |C    |
+--+---------+---------+---------+-----+-----+-----+

现在这很有效,除非当其中一个id为null时,我得不到任何结果:

select * from tableA where id = 2;
+--+---------+---------+---------+
|ID|TABLEB1ID|TABLEB2ID|TABLEB3ID|
+--+---------+---------+---------+
|2 |1        |2        |         |
+--+---------+---------+---------+

select tableA.*, tableB1.name name1, tableB2.name name2, tableB3.name name3
from tableA, tableB tableB1, tableB tableB2, tableB tableB3
where tableA.id = 2 and
      tableA.tableB1id = tableB1.id and
      tableA.tableB2id = tableB2.id and
      tableA.tableB3id = tableB3.id;

+--+---------+---------+---------+-----+-----+-----+
|ID|TABLEB1ID|TABLEB2ID|TABLEB3ID|NAME1|NAME2|NAME3|
+--+---------+---------+---------+-----+-----+-----+
+--+---------+---------+---------+-----+-----+-----+

我不太熟悉SQL所具有的所有功能,我将非常感谢获得如下输出的任何帮助:

+--+---------+---------+---------+-----+-----+-----+
|ID|TABLEB1ID|TABLEB2ID|TABLEB3ID|NAME1|NAME2|NAME3|
+--+---------+---------+---------+-----+-----+-----+
|2 |1        |2        |         |A    |B    |     |
+--+---------+---------+---------+-----+-----+-----+

OR

+--+---------+---------+-----+-----+
|ID|TABLEB1ID|TABLEB2ID|NAME1|NAME2|
+--+---------+---------+-----+-----+
|2 |1        |2        |A    |B    |
+--+---------+---------+-----+-----+

我知道必须有一个功能可以帮助我解决这个问题,我只是很难找到它并编写查询。任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:3)

您需要使用LEFT OUTER JOIN来实现此方法。您现在正在进行的JOIN类型等同于INNER JOIN,除非所有联接的双方都满意,否则不会返回,这就是为什么您不是&#39得到任何结果。

使用OUTER JOIN,如果任何TableB变体的数据不存在,您只需返回 NULL

请尝试以下方法:

Select      A.*, 
            B1.Name Name1,
            B2.Name Name2,
            B3.Name Name3
From        TableA  A
Left Join   TableB  B1  On  A.TableB1ID = B1.Id
Left Join   TableB  B2  On  A.TableB2ID = B2.Id
Left Join   TableB  B3  On  A.TableB3ID = B3.Id
Where       A.Id = 2;

答案 1 :(得分:1)

左外连接的替代方法是在选择列表中使用子查询:

setChild

这样可以启用子查询缓存,这可能会也可能不会提供性能优势,具体取决于您的数据是否具有多个重复值。您应该针对您的数据测试这两个查询,以查看哪一个最适合您。