首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个很敏琐的SQL语句的优化,该如何解决

2012-04-11 
一个很敏琐的SQL语句的优化我想采购下单的时候,可以即时查看到,业务定单主产品分解出子物料的需求数,当前

一个很敏琐的SQL语句的优化
我想采购下单的时候,可以即时查看到,业务定单主产品分解出子物料的需求数,当前库存量,已下单数,实际需求量

下面是SQL语句....各位牛人有啥优化方案


ALTER   PROCEDURE   dbo.Re_形式发票ID_工厂采购
(@形式发票ID   int)
AS   SELECT   dbo.物料表.物料编码   AS   主产品编码,   物料表_1.物料编码   AS   子产品编码,  
            dbo.形式发票明细表.数量   *   dbo.物料配置明细表.数量   AS   需求数,   下单数   AS   下单数,  
            TempTable2.库存数量
FROM   (SELECT   dbo.工厂采购单.形式发票ID,   dbo.工厂采购明细单.产品ID,  
                            SUM(dbo.工厂采购明细单.数量)   AS   下单数
                FROM   dbo.工厂采购单,   dbo.工厂采购明细单
                WHERE   形式发票ID   =   @形式发票ID   AND  
                            dbo.工厂采购单.采购单编号   =   dbo.工厂采购明细单.采购单编号
                GROUP   BY   dbo.工厂采购明细单.产品ID,   dbo.工厂采购单.形式发票ID)  
            TempTable   INNER   JOIN
            dbo.形式发票明细表   ON  
            TempTable.形式发票ID   =   dbo.形式发票明细表.形式发票ID   INNER   JOIN
            dbo.物料配置明细表   ON  
            TempTable.产品ID   =   dbo.物料配置明细表.物料ID   INNER   JOIN
            dbo.物料配置主表   ON   dbo.形式发票明细表.产品ID   =   dbo.物料配置主表.物料ID   AND  
            dbo.物料配置明细表.物料配置ID   =   dbo.物料配置主表.物料配置ID   INNER   JOIN
            dbo.物料表   物料表_1   ON   dbo.物料配置明细表.物料ID   =   物料表_1.物料ID   INNER   JOIN
            dbo.物料表   ON   dbo.物料配置主表.物料ID   =   dbo.物料表.物料ID   INNER   JOIN
                    (SELECT   物料编码,   SUM(库存数量)   AS   库存数量
                  FROM   (SELECT   dbo.物料表.物料编码,  
                                              dbo.物料分仓库配置明细单.期初数量   AS   库存数量
                                  FROM   dbo.物料分仓库配置单   INNER   JOIN
                                              dbo.物料表   ON  
                                              dbo.物料分仓库配置单.物料ID   =   dbo.物料表.物料ID   LEFT   OUTER   JOIN
                                              dbo.物料分仓库配置明细单   ON  
                                              dbo.物料分仓库配置单.物料分仓库配置ID   =   dbo.物料分仓库配置明细单.配置ID


                                  UNION   ALL
                                  SELECT   物料表.物料编码,   -   车间出库明细表.数量
                                  FROM   物料表   INNER   JOIN
                                              车间出库明细表   ON   物料表.物料ID   =   车间出库明细表.产品ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   -   供应商出库明细表.数量
                                  FROM   供应商出库明细表   INNER   JOIN
                                              物料表   ON   供应商出库明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   供应商入库明细表.数量
                                  FROM   供应商入库明细表   INNER   JOIN
                                              物料表   ON   供应商入库明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   -   客户出库明细表.数量
                                  FROM   客户出库明细表   INNER   JOIN
                                              物料表   ON   客户出库明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   客户入库明细表.数量
                                  FROM   客户入库明细表   INNER   JOIN
                                              物料表   ON   客户入库明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL


                                  SELECT   物料表.物料编码,   -   报损明细表.数量
                                  FROM   报损明细表   INNER   JOIN
                                              物料表   ON   报损明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   -   车间出库明细表.数量
                                  FROM   车间出库明细表   INNER   JOIN
                                              物料表   ON   车间出库明细表.产品ID   =   物料表.物料ID
                                  UNION   ALL
                                  SELECT   物料表.物料编码,   车间入库明细表.数量
                                  FROM   车间入库明细表   INNER   JOIN
                                              物料表   ON   车间入库明细表.产品ID   =   物料表.物料ID)  
                              TempTable
                  GROUP   BY   物料编码
                  HAVING   (SUM(库存数量)   IS   NOT   NULL))   TempTable2   ON  
            TempTable2.物料编码   =   物料表_1.物料编码
WHERE   (dbo.形式发票明细表.形式发票ID   =   @形式发票ID)   OPTION   (FORCE   ORDER)



[解决办法]
把中文先换成英文或拼音,表上加别名,看起来能简化点。
[解决办法]
---------这个地方可以放在视图中处理,用的时候可以直接调用视图就可以了------------

SELECT 物料编码, 库存数量=SUM(库存数量)
FROM (
SELECT dbo.物料表.库存数量=物料编码,dbo.物料分仓库配置明细单.期初数量
FROM dbo.物料分仓库配置单
INNER JOIN dbo.物料表 ON dbo.物料分仓库配置单.物料ID = dbo.物料表.物料ID
LEFT OUTER JOIN dbo.物料分仓库配置明细单 ON dbo.物料分仓库配置单.物料分仓库配置ID = dbo.物料分仓库配置明细单.配置ID
UNION ALL
SELECT 物料表.物料编码, - 车间出库明细表.数量
FROM 物料表 INNER JOIN
车间出库明细表 ON 物料表.物料ID = 车间出库明细表.产品ID
UNION ALL
SELECT 物料表.物料编码, - 供应商出库明细表.数量
FROM 供应商出库明细表 INNER JOIN
物料表 ON 供应商出库明细表.产品ID = 物料表.物料ID
UNION ALL
SELECT 物料表.物料编码, 供应商入库明细表.数量
FROM 供应商入库明细表 INNER JOIN
物料表 ON 供应商入库明细表.产品ID = 物料表.物料ID
UNION ALL
SELECT 物料表.物料编码, - 客户出库明细表.数量
FROM 客户出库明细表 INNER JOIN
物料表 ON 客户出库明细表.产品ID = 物料表.物料ID
UNION ALL
SELECT 物料表.物料编码, 客户入库明细表.数量
FROM 客户入库明细表 INNER JOIN
物料表 ON 客户入库明细表.产品ID = 物料表.物料ID


UNION ALL
SELECT 物料表.物料编码, - 报损明细表.数量
FROM 报损明细表 INNER JOIN
物料表 ON 报损明细表.产品ID = 物料表.物料ID
UNION ALL
SELECT 物料表.物料编码, - 车间出库明细表.数量
FROM 车间出库明细表 INNER JOIN
物料表 ON 车间出库明细表.产品ID = 物料表.物料ID
UNION ALL
SELECT 物料表.物料编码, 车间入库明细表.数量
FROM 车间入库明细表 INNER JOIN
物料表 ON 车间入库明细表.产品ID = 物料表.物料ID
[解决办法]
可以把查询语句中的子查询语句用视图的方式来代替

[解决办法]
优化的方法是有的。如
从dbo.形式发票明细表.形式发票ID = @形式发票ID这一WHERE条件入手。
在各个UNION ALL中尽量加WHERE条件以减少不必要的开销,这些UNION ALL可以考虑分解使用临时表来构造,这样可能效率更好,也比较容易调试和维护。
不要一口气写这么多,在别人看来可能是牛人呢,呵呵,但要考虑效率,和维护难度,不然后面就很难了。

热点排行
Bad Request.