SQL实例之五

logistics

物流商(logistics)会有多个运输方式(logistics_transport),这是一对多的关系。运输方式(transport)定义了系统使用的运输方式,这些运输方式有些物流商(logistics)并没有对应的运输方式,相反,有些物流商(logistics)提供了对应的运输方式,但系统可能并不使用它,所以在运输方式(transport)、物流商(logistics)和物流商运输方式(logistics_transport)中间必须存在一个对应关系,它记录了某运输方式对应的某个物流商以及物流商的某个运输方式。

这样的关系模型,在关系数据库设计中还是非常常见的。

要获取某物流商对应的系统运输方式 或 获取系统运输方式对应的物流商运输方式,只要进行简单的JOIN操作即可。不过现在系统是针对所有系统运输方式,都那个所有物流商与之匹配,然后选择需要的进行设置,举例:

物流商:Lgstcs_A Lgstcs_B
系统运输方式:Trsprt_01 Trsprt_02

输出:

Trsprt_01		Lgstcs_A		选择Lgstcs_A的对应运输方式
Trsprt_02		Lgstcs_A		选择Lgstcs_A的对应运输方式
Trsprt_01		Lgstcs_B		选择Lgstcs_B的对应运输方式
Trsprt_02		Lgstcs_B		选择Lgstcs_B的对应运输方式

这里的transport和logistics是典型的无条件JOIN关系,SQL如下:

SELECT t.transport_code, t.transport_name, l.logistics_code, l.logistics_name
    FROM transport t JOIN logistics l 
        LEFT JOIN transport_logistics_transport tlt ON (tlt.transport_id = t.id AND tlt.logistics_id = l.id) 

这个查询在transport和logistics没有添加新记录的情况下,返回的记录都是一样的,当设置了对应的物流商运输方式时,会对应一条记录插入到transport_logistics,如果没有设置,对应的记录就要删除。

这里搞这个查询主要是因为transport和logistics都是小集合,比如运输方式只有几种到二三十种左右,物流商应该低于十种,所以把它们全部的可能列出来,反而是很直观的。