2013-12-08 241 views
0

有3个表优化查询

Table min consist of matcode,min_qty,jo_no,mr_no,min_no 
Table min_out_body consist of matcode,out_qty,jo_no,mr_no,min_no 
Table eu_min_out_body consist of matcode,out_qty,jo_no,mr_no,min_no 

和数据如下的结构:

[min] 
matcode  min_qty   jo_no   mr_no   min_no 
xxx   100    1A    A11   A111 
xxx   150    2A    A22   A222 
yyy   100    1A    A11   A111 
zzz   150    2A    A22   A222 

[min_out_body] 
matcode  out_qty   jo_no   mr_no   min_no 
xxx   10    1A    A11   A111 
xxx   60    1A    A11   A111 
xxx   100    2A    A22   A222 
yyy   100    1A    A11   A111 

[eu_min_out_body] 
matcode  out_qty   jo_no   mr_no   min_no 
xxx   20    1A    A11   A111 
xxx   50    2A    A22   A222 
zzz   100    2A    A22   A222 

什么,我想实现的是有一个结果:

matcode  min_qty   jo_no   mr_no   balance 
xxx   100    1A    A11   10 
zzz   150    2A    A22   50 

使用以下代码查询:

SELECT 
min.matcode, 
min.min_qty, 
min.jo_no, 
min.mr_no, 
(min.min_qty-(
    select ifnull(sum(out_qty),0) 
    FROM min_out_body 
    WHERE min_no=min.min_no 
    and matcode=min.matcode 
    and jo_no=min.jo_no 
    and mr_no=min.mr_no 
    )-(
    select ifnull(sum(out_qty),0) 
    FROM eu_min_out_body 
    WHERE min_no=min.min_no 
    and matcode=min.matcode 
    and jo_no=min.jo_no 
    and mr_no=min.mr_no 
    ) 
) as balance 

FROM min 
WHERE (min.min_qty - (select 
       ifnull(sum(out_qty),0) 
      FROM min_out_body 
      WHERE min_no=min.min_no 
      and matcode = min.matcode 
       and jo_no = min.jo_no 
       and mr_no = min.mr_no) - (select 
          ifnull(sum(out_qty),0) 
           FROM eu_min_out_body 
           WHERE min_no=min.min_no 
           and matcode = min.matcode 
           and jo_no = min.jo_no 
           and mr_no = min.mr_no)) > 0 

我可以得到结果,但是有什么办法可以简化查询并减少处理时间吗?

下面是从SQL小提琴样本数据sqlfiddle.com/#!2/1fb8b/1

+0

你能解释一下如何处理这3个原始表格以产生这两行? –

回答

0

我想我并没有完全从之前的几乎相同的问题,您的评论理解。答案实际上应该与除去明确只做matcode ='xxx'的所有WHERE子句的例外情况相同。

通过删除这些,您将通过每个min/eu_min表的标准将所有matcode作为组的一部分。

删除WHERE子句。

where mob.matcode = 'xxx' 

where Emob.matcode = 'xxx' 

where min.matcode = 'xxx' AND min.min_qty .... 
to just 
where min.min_qty ... 
+0

感谢DRapp,解决了,我的错误是没有对你的查询进行额外的关注。 – user3077209