需要帮助来简化查询

时间:2021-05-18 10:25:05

标签: sql ms-access

我有一个需要简化的查询,但仍然给出相同的结果但速度更快,这是结果查询

SELECT Table2.PoNumber
     , Nz([MaterialCode],"None") AS MatCode
     , Nz([Material],"None") AS Mat
     , Nz([MaterialCons],"None") AS MatCons
     , Nz([MasterCode],"None") AS MastCode
     , Nz([Master],"None") AS Masterr
     , Nz([MasterCons],"None") AS MasterrCons
     , Nz([StretchCode],"None") AS StrCode
     , Nz([Stretch],"None") AS Str
     , Nz([StretchCons],"None") AS StrCons
     , Nz([PackCode],"None") AS PacCode
     , Nz([Pack],"None") AS Package
     , Nz([PackCons],"None") AS PacCons
     , Nz([MasterCons]/[MaterialCons],0) AS MasterPercent
FROM (((Table2 LEFT JOIN Sub1 ON Table2.PoNumber = Sub1.Po) 
LEFT JOIN Sub2 ON Table2.PoNumber = Sub2.Po) 
LEFT JOIN Sub3 ON Table2.PoNumber = Sub3.Po) 
LEFT JOIN Sub4 ON Table2.PoNumber = Sub4.Po;

此查询依赖于 4 个子查询:

Sub1

SELECT Table1.Code AS MaterialCode
     , Table1.Item AS Material
     , Table1.Cons AS MaterialCons
     , Table1.Po
FROM Table1
WHERE (((Table1.Type)="Material"))
GROUP BY Table1.Code
       , Table1.Item
       , Table1.Cons
       , Table1.Po;

Sub2

SELECT Table1.Code AS MasterCode
     , Table1.Item AS Master
     , Table1.Cons AS MasterCons
     , Table1.Po
FROM Table1
WHERE (((Table1.Type)="MasterPatch"))
GROUP BY Table1.Code
       , Table1.Item
       , Table1.Cons
       , Table1.Po;

Sub3

SELECT Table1.Code AS StretchCode
     , Table1.Item AS Stretch
     , Table1.Cons AS StretchCons
     , Table1.Po
FROM Table1
WHERE (((Table1.Type)="Stretch"))
GROUP BY Table1.Code
       , Table1.Item
       , Table1.Cons
       , Table1.Po;

Sub4

SELECT Table1.Code AS PackCode
     , Table1.Item AS Pack
     , Table1.Cons AS PackCons
     , Table1.Po
FROM Table1
WHERE (((Table1.Type)="Package"))
GROUP BY Table1.Code
       , Table1.Item
       , Table1.Cons
       , Table1.Po;

我需要取消那 4 个子查询,但仍然得到相同的结果。 注意:主数据库变得丑陋,因为如此多的查询依赖于相同的加入方式。基本上取决于一两个表,但有多个标准。所以我需要更高效的方法。

谢谢。

2 个答案:

答案 0 :(得分:0)

我没有看到按子查询分组的目的。我认为您的整个查询应如下所示:

SELECT Table2.PoNumber, ...
FROM Table2 LEFT JOIN Table1 ON Table2.PoNumber = Table1.Po
WHERE Table1.Type IN ("Material", "MasterPatch", "Stretch", "Package");

答案 1 :(得分:0)

由于您打算开发多种格式的数据,请考虑使用两个表中的 LEFT JOIN 进行条件格式设置。但是,每组只有一个值会被广泛重塑。因此,使用下面的 MAX 将选择按字母顺序排列的最大值(如果是字符串)或最大数字值(如果是用于 CodeItemCons 字段。如果每个 Type 分组只有一个 CodeItemCons,则不会丢失任何数据。

此外,假设您对 Cons 列进行除法运算,则这些列被假定为数字字段,因此不会包含在 NZ'None' 中以返回字符串列。如果 Cons 是数字,请考虑根据需要将聚合从 MAX 调整为 SUMAVG。最后,避免被零除。

SELECT t2.PoNumber
     , Nz(MAX(IIF(t1.Type='Material', t1.Code, NULL)), 'None') AS MatCode
     , Nz(MAX(IIF(t1.Type='Material', t1.Item, NULL)), 'None') AS Mat
     , MAX(IIF(t1.Type='Material', t1.Cons, NULL)) AS MatCons

     , Nz(MAX(IIF(t1.Type='MasterPatch', t1.Code, NULL)), 'None') AS MastCode
     , Nz(MAX(IIF(t1.Type='MasterPatch', t1.Item, NULL)), 'None') AS Masterr
     , MAX(IIF(t1.Type='MasterPatch', t1.Cons, NULL)) AS MasterCons

     , Nz(MAX(IIF(t1.Type='Stretch', t1.Code, NULL)), 'None') AS StrCode
     , Nz(MAX(IIF(t1.Type='Stretch', t1.Item, NULL)), 'None') AS Str
     , MAX(IIF(t1.Type='Stretch', t1.Cons, NULL)) AS StrCons

     , Nz(MAX(IIF(t1.Type='Package', t1.Code, NULL)), 'None') AS PacCode
     , Nz(MAX(IIF(t1.Type='Package', t1.Item, NULL)), 'None') AS Package
     , MAX(IIF(t1.Type='Package', t1.Cons, NULL)) AS PacCons

     , Nz(IIF([MatCons] <> 0, [MasterCons] / [MatCons], NULL), 0) AS MasterPercent

FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.PoNumber = t1.Po
GROUP BY t2.PoNumber

或者,如果每个 Type 分组有多个 CodeItemCons,请避免外层聚合。注意将 DISTINCTType 添加到 SELECT 以用于外层的 IIF 条件。

SELECT t2.PoNumber
     , IIF(t1.Type='Material', t1.Code, 'None') AS MatCode
     , IIF(t1.Type='Material', t1.Item, 'None') AS Mat
     , IIF(t1.Type='Material', t1.Cons, NULL) AS MatCons

     , IIF(t1.Type='MasterPatch', t1.Code, 'None') AS MastCode
     , IIF(t1.Type='MasterPatch', t1.Item, 'None') AS Masterr
     , IIF(t1.Type='MasterPatch', t1.Cons, NULL) AS MasterCons

     , IIF(t1.Type='Stretch', t1.Code, 'None') AS StrCode
     , IIF(t1.Type='Stretch', t1.Item, 'None') AS Str
     , IIF(t1.Type='Stretch', t1.Cons, NULL) AS StrCons

     , IIF(t1.Type='Package', t1.Code, 'None') AS PacCode
     , IIF(t1.Type='Package', t1.Item, 'None') AS Package
     , IIF(t1.Type='Package', t1.Cons, NULL) AS PacCons

     , NZ(IIF([MatCons] <> 0, [MasterCons] / [MatCons], NULL), 0) AS MasterPercent

FROM Table2 t2
LEFT JOIN (
    SELECT DISTINCT [Type], [Code], [Item], [Cons], [Po]
    FROM Table1
    WHERE Table1.Type IN ('Material', 'MasterPatch', 'Stretch', 'Package')
) t1