使用多个子选择简化SQL查询

时间:2017-01-31 20:38:46

标签: sql ms-access query-performance

目标

我想在视觉长度(减少嵌套的子选择量)和/或性能和/或可读性方面简化以下sql查询。此查询专用于MS Access,这就是INNER JOIN周围有括号的原因。

说明

  • 为了不丢失全局视图,在ON子句之后,所有表关系都会缩短。
  • 表S1和S2是相同的表S.为了工作,在不同的子选择中分离S的名称需要查询(准确的MS访问)。
  • 1级查询(T1)计算在特定时间段内所有生产区域和子区域的PPM中的缺陷数量,生产数量和缺陷率。
  • 第2级查询(T2)计算每个区域T1中缺陷率的总和,并添加一些额外信息,例如特定的一个主要用户来自许多附加到区域,区域名称本身以及针对特定年份和月份的目标。
  • 第3级查询从第2级获取所有内容并添加为特定年份和周定义的注释,并将所有列表过滤到缺陷率总和超过目标的区域。

此查询按预期工作,结果表中的所有列都显示正确计算的值和字段。

是否可以简化此查询?

注意

我添加了sql-server标记以吸引更多亲用户。对不起,如果它不适合。

查询

SELECT s1id, s2name, user, target, ratio, C.msg AS msg
FROM 

(SELECT s1id, S2.nam AS s2name, (U.lastname & ' ' & U.firstname) AS user, T.m1 AS target, SUM(ratio1) as ratio
FROM ((((

(SELECT S1.id AS s1id, WG.id AS wgid, SUM(IIF(D.ok=False,F.qty,0)) AS nok, SUM(F.qty) AS production, IIF(production > 0, CLNG(nok/production * 1000000), 0) AS ratio1 
FROM (((F
INNER JOIN D ON D.x = F.x)
INNER JOIN W ON W.x = D.x)
INNER JOIN WG ON WG.x = W.x)
INNER JOIN S1 ON S1.x = WG.x
WHERE F.entrydate BETWEEN #2017-01-23# And #2017-01-29#
GROUP BY S1.id, WG.id) AS T1

INNER JOIN S2 ON S2.x = T1.x)
INNER JOIN UPS ON UPS.x = S2.x)
INNER JOIN UP ON UP.x = UPS.x)
INNER JOIN U ON U.x = UP.x)
INNER JOIN T ON T.x = S2.x
WHERE UPS.main = true AND UP.positionid = 3 AND T.y = 2017 
GROUP BY sectorid, S2.nam, U.lastname, U.firstname, T.m1) AS T2

INNER JOIN C ON C.x = T2.x
WHERE C.yearnum = 2017 AND C.weeknum = 4 AND ratio > target

0 个答案:

没有答案