我对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 |
+--+---------+---------+-----+-----+
我知道必须有一个功能可以帮助我解决这个问题,我只是很难找到它并编写查询。任何帮助都会很棒。感谢。
答案 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
这样可以启用子查询缓存,这可能会也可能不会提供性能优势,具体取决于您的数据是否具有多个重复值。您应该针对您的数据测试这两个查询,以查看哪一个最适合您。