一个SQL多张表连接的例子

【博主SAP/ABAP交流群53144545

之前碰到一个需求需要多表连接,现在把需求简化一下作为一个学习的参考案例。

 

有三张表,如图。

一个SQL多张表连接的例子

一个SQL多张表连接的例子

一个SQL多张表连接的例子

为描述方便,分别用表1,表2和表3指代。

表1里面的ID和表2里面的ID有关联关系。

表2里面的ID_LINK和表3里面的ID_LINK有关联关系。

现在需求是要找到表1里没有TEXT(在表3里面)的ID。

 

如果只是简单地使用内连接:

一个SQL多张表连接的例子

这样只能找到ID是2的那条记录,不过ID3,4,5同样是没有TEXT的记录,只是没有关联数据,这种情况用内连接是无法选到的。

 

接下来使用左连接:

一个SQL多张表连接的例子

注意这里我使用了Open SQL新语法,新语法对左连接支持比较好,在老语法里不支持的一些where条件筛选,在新语法里都支持。

结果如下:

 一个SQL多张表连接的例子

可以看到所有的ID都被取出来了,在此基础上得到没有TEXT的ID即可。

 

如果在上例左连接里,直接加上text=space的where条件。

一个SQL多张表连接的例子

结果如下:

一个SQL多张表连接的例子

可以看到,只有ID2那条被选到了,也就是表能够连接到,但TEXT字段是空值的那条记录,对于没有对应表关联的ID3,4,5是选不到的。


如果需要选到没有对应表关联的ID3,4,5,则需要加上IS NULL的条件。

一个SQL多张表连接的例子

结果如下:

一个SQL多张表连接的例子



再改变下写法,把表2和表3的连接改为内连接。

一个SQL多张表连接的例子

结果如下:

一个SQL多张表连接的例子

可以看到没有把所有的ID都列出来。

 

连接就先列这么些情况,再说点其他细节。

如果确定表1的ID和表3的TEXT是一对一的对应关系,那么对于刚刚两个左连接选出来的内表,建议再做排序和去重复。

一个SQL多张表连接的例子

原因是表3的ID_LINK不是主键,可能会有重复的情况(即使在业务上不可能,在数据库层面有不一致的数据也是有可能发生)。

比如如果表3有两个ID_LINK是1的场合。

一个SQL多张表连接的例子

那么选出来将是这样:

 一个SQL多张表连接的例子


ID_LINK是空值情况。

如果表2和表3是这样的。

 一个SQL多张表连接的例子

一个SQL多张表连接的例子

 

那么结果会这样:

一个SQL多张表连接的例子

在做连接尽量多考虑下连接字段是空值的情况,空值很多时候是数据不一致,是一种错误的数据,会造成交叉取数,影响最终的取数结果。

 

最后还想说一点,这三张数据库表的关联设计得不是很好,可以看到表3的主键没有起到作用,所以这是造成上面取数困难的主要原因。对于一些系统标准的就是这么设计的就没有办法了,但如果是自定义表的话,表和表之间尽量使用主键关联。