【博主SAP/ABAP交流群53144545】
之前碰到一个需求需要多表连接,现在把需求简化一下作为一个学习的参考案例。
有三张表,如图。
为描述方便,分别用表1,表2和表3指代。
表1里面的ID和表2里面的ID有关联关系。
表2里面的ID_LINK和表3里面的ID_LINK有关联关系。
现在需求是要找到表1里没有TEXT(在表3里面)的ID。
如果只是简单地使用内连接:
这样只能找到ID是2的那条记录,不过ID3,4,5同样是没有TEXT的记录,只是没有关联数据,这种情况用内连接是无法选到的。
接下来使用左连接:
注意这里我使用了Open SQL新语法,新语法对左连接支持比较好,在老语法里不支持的一些where条件筛选,在新语法里都支持。
结果如下:
可以看到所有的ID都被取出来了,在此基础上得到没有TEXT的ID即可。
如果在上例左连接里,直接加上text=space的where条件。
结果如下:
可以看到,只有ID2那条被选到了,也就是表能够连接到,但TEXT字段是空值的那条记录,对于没有对应表关联的ID3,4,5是选不到的。
如果需要选到没有对应表关联的ID3,4,5,则需要加上IS NULL的条件。
结果如下:
再改变下写法,把表2和表3的连接改为内连接。
结果如下:
可以看到没有把所有的ID都列出来。
连接就先列这么些情况,再说点其他细节。
如果确定表1的ID和表3的TEXT是一对一的对应关系,那么对于刚刚两个左连接选出来的内表,建议再做排序和去重复。
原因是表3的ID_LINK不是主键,可能会有重复的情况(即使在业务上不可能,在数据库层面有不一致的数据也是有可能发生)。
比如如果表3有两个ID_LINK是1的场合。
那么选出来将是这样:
ID_LINK是空值情况。
如果表2和表3是这样的。
那么结果会这样:
在做连接尽量多考虑下连接字段是空值的情况,空值很多时候是数据不一致,是一种错误的数据,会造成交叉取数,影响最终的取数结果。
最后还想说一点,这三张数据库表的关联设计得不是很好,可以看到表3的主键没有起到作用,所以这是造成上面取数困难的主要原因。对于一些系统标准的就是这么设计的就没有办法了,但如果是自定义表的话,表和表之间尽量使用主键关联。