我有一个需要简化的查询,但仍然给出相同的结果但速度更快,这是结果查询
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 个子查询,但仍然得到相同的结果。 注意:主数据库变得丑陋,因为如此多的查询依赖于相同的加入方式。基本上取决于一两个表,但有多个标准。所以我需要更高效的方法。
谢谢。
答案 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
将选择按字母顺序排列的最大值(如果是字符串)或最大数字值(如果是用于 Code、Item 和 Cons的数字) em> 字段。如果每个 Type 分组只有一个 Code、Item、Cons,则不会丢失任何数据。
此外,假设您对 Cons 列进行除法运算,则这些列被假定为数字字段,因此不会包含在 NZ
和 'None'
中以返回字符串列。如果 Cons 是数字,请考虑根据需要将聚合从 MAX
调整为 SUM
或 AVG
。最后,避免被零除。
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 分组有多个 Code、Item 和 Cons,请避免外层聚合。注意将 DISTINCT
和 Type 添加到 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