主从表结构,当查询条件中既包含主表字段,又包含子表字段,怎么写SQL最好

主从表结构,当查询条件中既包含主表字段,又包含子表字段,怎么写SQL最好

问题描述:

一个采购单列表,表结构分为采购单头和采购单体;采购单头中有单据编号、供应商编码字段;采购单体中有采购物料编码、采购物料名称字段。

如果同时想根据以上字段进行采购单列表的查询,该怎么写SQL语句?

除了在where条件中加上:采购单头id in (select 采购单头id from 采购单体 where 采购物料编码 Like XXX)方法之外,还有没有好一点的方法,请各位指点一二。

要完善一下表结构,采购单体中有也要有单据编号,通过left join,或者inner join 关联

select * from 采购单体 b left join  采购单头 h on b.单据编号=h.单据编号 where 采购物料编码 Like XXX

 

写left join

应该没有比现有的方案好很多的方法。你这个方案已经算是比较好的了吧。其他的方案,效率不一定比你的高,但是 sql 一定比你的复杂。你是出于什么原因想要优化这条 sql 呢?稍微可以优化的地方也就是在查出来之后可以去重复,利用 DISTINCT。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

我想到的第一种方式是在where条件加上 采购单头id in (select 采购单头id from 采购单体 where 采购物料编码 Like XXX)的逻辑,但是这样会导致每查一条数据都会执行一遍select 采购单头id from 采购单体 where 采购物料编码 Like XXX,复杂度相当于是n*n。

 想到的第二种方法是,先查询一次 select 采购单头id from 采购单体 where 采购物料编码 Like XXX 语句,把采购单头id的集合记录下来,然后再用采购单头id in (采购单头ids)的方法,这样的复杂度是n,但是会读取所有满足采购物料编码符合条件的记录,n值较大。

第三种方法就是最后决定采用的方法,使用left join,将采购单头和采购单体连接起来,然后进行采购单编号、供应商、物料条件的搜索,这样的复杂度为n,但n值较小,然后对采购单头id进行distinct操作,再用采购单头id in (采购单头ids)的方法,乍一看这种方法比第二种麻烦,但是在数据量大的情况第三种方法好一些。

以上属于我总结出来的结果,若有不足之处还请各位指出。