【发布时间】:2017-03-23 17:13:24
【问题描述】:
我开始处理多年前使用 ACCESS 生成的旧数据库。所有查询都是使用 ACCESS 查询向导设计的,它们似乎非常耗时,我想提高它们的性能。
所有查询都依赖于至少三个子查询,我想重写 SQL 代码以将它们转换为单个查询。
这里有一个我所说的例子:
这是主要查询:
选择 Subquery1.pid、Table4.SIB、Subquery1.event、 Subquery1.event_date、Subquery2.GGG、Subquery3.status FROM Subquery1 LEFT JOIN ((Table4 LEFT JOIN Subquery2 ON Table4.SIB = Subquery2.SIB) LEFT JOIN Subquery3 ON Table4.SIB = Subquery3.SIB) ON Subquery1.pid = Table4.PID;
这个主查询依赖于三个子查询:
子查询1
选择 Table2.id、Table2.pid、Table2.npid、Table3.event_date、 Table3.event, Table3.notes, Table2.other FROM Table2 INNER JOIN Table3 ON Table2.id = Table3.subject_id WHERE (((Table2.pid) 不为空) AND ((Table3.event_date)>#XX/XX/XXXX#) AND ((Table3.event) Like "*AAAA" 或 (Table3.event)="BBBB")) ORDER BY Table2.pid, Table3.event_date DESC;
子查询2
SELECT Table1.SIB, IIf(Table1.GGG Like "AAA","BBB", IIf(Table1.GGG 像 "CCC","BBB", IIf(Table1.GGG 像 "DDD","DDD","EEE"))) AS GGG FROM 表1;
子查询3
SELECT Table5.SIB, Table5.PID, IIf(Table5.field1 Like "1","ZZZ",IIf(Table5.field1 喜欢 "2","ZZZ",IIf(Table5.field1 喜欢 "3","ZZZ",IIf(Table5.field1 喜欢 "4","HHH",IIf(Table5.field1 喜欢 "5","HHH",IIf(Table5.field1 Like "6","HHH","UUU")))))) AS SSS FROM 表5;
这将是提高此查询的性能并将所有子查询转换为单个语句的最佳方法。
我可以处理每个子查询,但我很难将它们连接在一起。
有人可以帮我处理这段代码吗?
非常感谢,
最好的,
【问题讨论】:
-
就将它们合并为一个而言,您应该能够简单地将主查询的 FROM 中的引用替换为别名为它们的实际子查询;例如
FROM Subquery1 ....变为FROM (SELECT Table2.id ..... Table3.event_date DESC) AS Subquery1 ....显然,您还需要将所有查询转换为适当的 sql 方言; MySQL 不会喜欢IIf或#date#。 -
这就是我尝试的方式,但它总是返回错误
-
您是否翻译了用于子查询的查询并确保它们在尝试合并之前自行正确运行?
-
是的,我做到了,但我错过了 AS 子查询语句之一。现在它起作用了!下一个问题是:将子查询作为临时表运行是否有意义,或者性能是否完全相同?
-
使用临时表确实取决于太多因素,无法给出明确的答案;但是,有一个强烈的论据甚至反对将后两个子查询作为子查询。看起来您可以直接将 Table1 和 Table5 连接到 Table4,并将它们的子查询版本的 SELECT 字段计算移动到主查询的 SELECT 中。
标签: sql ms-access select left-join inner-join