一个很敏琐的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可以考虑分解使用临时表来构造,这样可能效率更好,也比较容易调试和维护。
不要一口气写这么多,在别人看来可能是牛人呢,呵呵,但要考虑效率,和维护难度,不然后面就很难了。