select MIN(isnull((select sum(QTY) from BOMVCHR2 where WORKCODE = C.CODE and PROD = D.SUBPROD),0)/D.TOTNEED*C.QTY)aaa from BOMWORK C,BOMWORK3 D where C.CODE = D.CODE 怎么优化这段sql
时间: 2024-01-09 18:04:12 浏览: 106
可以考虑以下优化措施:
1. 使用 JOIN 替代子查询,可以减少查询次数。
2. 将isnull函数转换为COALESCE函数,COALESCE函数在SQL Server中执行更快。
优化后的SQL语句如下:
```
SELECT MIN(COALESCE(SUM(B.QTY),0)/D.TOTNEED*C.QTY) aaa
FROM BOMWORK C
INNER JOIN BOMWORK3 D ON C.CODE = D.CODE
LEFT JOIN BOMVCHR2 B ON B.WORKCODE = C.CODE AND B.PROD = D.SUBPROD;
```
以上 SQL 语句使用了 INNER JOIN 和 LEFT JOIN,将 BOMVCHR2 表与 BOMWORK 和 BOMWORK3 表联接起来。同时使用 COALESCE 函数替换了 isnull 函数。这样可以减少查询次数,提高查询效率。
相关问题
SELECT CONVERT(varchar(100), A.CREATED, 23) ddate, (select Top 1 PubDefStr1 from M_F_RDS10 WHERE BatchNo=MATERIALLOT) pbs1, MATERIALLOT lot,a.MATERIAL_ID materialid,B.CODE materialcode,B.NAME materialname,C.CODE storagecode, C.NAME storagename,cast(a.Qty as float) QTY, (select Top 1 Z2.NAME from M_F_RDS01 Z LEFT JOIN M_F_RD01 Z1 ON Z.RD01_ID=Z1.ID LEFT JOIN M_V_VENDOR Z2 ON Z1.VENDOR_ID=Z2.ID WHERE Z.PUBDEFSTR1=MATERIALLOT and z.MATERIAL_ID=b.id and z.STORAGE_ID=c.id) vendorname, (SELECT ISNULL(SUM(ISNULL(D00.HAD,0)),0) FROM InventoryOccupancy D00 WHERE A.MATERIAL_ID=D00.MATERIAL_ID AND A.STORAGE_ID=D00.STORAGE_ID AND A.MATERIALLOT=D00.BATCHNO ) had FROM M_F_STOCKMATERIAL A LEFT JOIN M_M_MATERIAL B ON A.MATERIAL_ID=B.ID LEFT JOIN M_F_STORAGE C ON A.STORAGE_ID=C.ID
这是一条SQL查询语句,用于从多个数据表中获取一些字段的值。具体来说,它选取了以下字段:
1. A.CREATED:表示某个物料批次的创建日期时间。
2. M_F_RDS10.PubDefStr1:表示某个物料批次的一个公共定义字符串。
3. A.MATERIALLOT:表示某个物料批次的批次号。
4. A.MATERIAL_ID:表示某个物料批次所对应的物料的ID号。
5. B.CODE:表示某个物料的编码。
6. B.NAME:表示某个物料的名称。
7. C.CODE:表示某个存储区的编码。
8. C.NAME:表示某个存储区的名称。
9. A.Qty:表示某个物料批次的数量。
10. M_F_RDS01.Z2.NAME:表示某个物料批次所对应的供应商的名称。
11. InventoryOccupancy.HAD:表示某个物料在某个存储区的已有库存量。
其中,这些字段分别来自于以下数据表:
1. M_F_STOCKMATERIAL:表示物料的批次信息表。
2. M_M_MATERIAL:表示物料信息表。
3. M_F_STORAGE:表示存储区信息表。
4. M_F_RDS10:表示某个物料批次的批次信息表。
5. M_F_RDS01:表示某个物料批次所对应的入库单信息表。
6. M_V_VENDOR:表示供应商信息表。
7. InventoryOccupancy:表示某个物料在某个存储区的库存信息表。
优化C#代码:var ErtQuery = tQuery.Where(o => o.Process == "26").ToList(); var YitQuery = tQuery.Where(o => o.Process == "17").ToList(); YitQuery.RemoveAll(o => ErtQuery.Select(p => p.Barcode).Contains(o.Barcode)); var tQuery1 = YitQuery. Select(o => new FireRecord { Material = o.Material, TFireQty = !o.ChangeRemark.Contains("成检变更") ? o.Qty : 0, TChangeFireQty = o.ChangeRemark.Contains("成检变更") ? o.Qty : 0 }).ToList();
您可以尝试进一步优化这段代码,使其更加简洁和高效。下面是优化后的代码示例:
```csharp
var ErtQuery = tQuery.Where(o => o.Process == "26").ToList();
var YitQuery = tQuery.Where(o => o.Process == "17").ToList();
var ErtBarcodes = new HashSet<string>(ErtQuery.Select(p => p.Barcode));
YitQuery.RemoveAll(o => ErtBarcodes.Contains(o.Barcode));
var tQuery1 = YitQuery.Select(o => new FireRecord
{
Material = o.Material,
TFireQty = o.ChangeRemark.Contains("成检变更") ? 0 : o.Qty,
TChangeFireQty = o.ChangeRemark.Contains("成检变更") ? o.Qty : 0
}).ToList();
```
在这里,使用了 `HashSet<string>` 来存储 `ErtQuery` 中的 `Barcode` 值,以便更快地进行元素是否存在的判断。同时,合并了 `TFireQty` 和 `TChangeFireQty` 的计算,并使用三元表达式来简化逻辑。
请注意,优化代码之前,请确保对原始代码进行了充分的测试和验证,以确保逻辑正确性和预期结果的一致性。
阅读全文