标签归档:实例

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都是小集合,比如运输方式只有几种到二三十种左右,物流商应该低于十种,所以把它们全部的可能列出来,反而是很直观的。

SQL实例系列 之三

ER图
产品 与 供应商实现多对多关系,但是每个产品有一个默认供应商,这个字段记录在产品-供应商表(正确应该写入产品表);采购员 和 供应商也实现多对多关系,供应商有一个默认的采购员,写入了采购员-供应商(应该写入供应商表才对)。

现在问题是,要根据一个SKU,获取默认的采购员代码(就是要进入采购员表)。流程如下,先根据SKU定位到产品ID,根据这个产品ID到产品-供应商表中获取到供应商代码,用这个代码到采购员-供应商表中获取采购员ID,用这个ID到采购员表中获取采购员代码。

这个过程少说要搞5个查询…..

试着分析一下,产品有默认供应商,供应商有默认采购员,那么不就意味着产品有默认采购员吗?这样的话,就应该把默认供应商和默认采购员写入产品表中,当要获取供应商和采购员时都非常容易(也高效)。但是目前不是这样搞的。最终使用如下SQL实现这个需求:

SELECT u.采购员 FROME 产品表 p LEFT JOIN 产品多属性表 pv ON p.pid=pv.pid JOIN 产品-供应商表 pp ON pp.pid=p.pid AND pp.is_default=1 JOIN
(采购员-供应商 ppu JOIN采购员 u ON u.uid=ppu.uid AND ppu.is_default=1)
ON pp.supplier_code = ppu. supplier_code
WHERE if(p.is_var,pv.sku,p.sku)=SKU

很费劲,有么有?

数据模型设计的重要性在这里充分体现出来。