一个SQL多张表连接的例子

【博主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的主键没有起到作用,所以这是造成上面取数困难的主要原因。对于一些系统标准的就是这么设计的就没有办法了,但如果是自定义表的话,表和表之间尽量使用主键关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值