【问题标题】:Increasing MS ACCESS SQL Query Performance提高 MS ACCESS SQL 查询性能
【发布时间】:2013-06-17 14:39:36
【问题描述】:

我在 MS ACCESS SQL 中面临以下情况。 (由于连接问题,无法加载 SQLFiddle)

Table A :
ID, Code 1, Code 2, Source, Other Columns
10, A20, AA, x, etc 
10, A50, AA, x, etc
10, A70, AA, x, etc
10, E20, EE, x, etc
20, A25, AA, x, etc

Table B :
ID, Code 1, Code 2, Source, Other Columns
10, A20, AA, y, etc 
10, A50, AA, y, etc
20, B50, BB, y, etc
30, E20, EE, y, etc
40, A25, AA, y, etc

1. 两个表都有匹配的记录。

10, A20, AA, x, y, etc 
10, A50, AA, x, y, etc

2. 两个表都有不匹配的记录。

10, A70, AA, x, etc
10, E20, EE, x, etc
20, A25, AA, x, etc
20, B50, BB, y, etc
30, E20, EE, y, etc
40, A25, AA, y, etc

第一个内部查询:

Table A and B on ID, Code 1, Code 2, GROUP BY 之间的 INNER JOIN 以避免重复。选择进入新表C

第二次查询:

Table ATable C on ID, Code 1, Code 2 之间的NOT EXISTS 查询过滤掉匹配集中未找到的任何记录。

第三次查询:

Table BTable C on ID, Code 1, Code 2 之间的NOT EXISTS 查询过滤掉匹配集中未找到的任何记录。

SELECT T1.ID, T1.CODE1, T1.CODE2, T1.SOURCE, T1.OTHERCOLUMNS
FROM TABLE_A AS T1
WHERE NOT EXISTS(SELECT DISTINCT T2.ID FROM TABLE_C AS T2
                 WHERE T2.ID = T1.ID AND T2.CODE1 = T1.CODE1 
                 AND T2.CODE2 = T1.CODE2)
GROUP BY T1.ID, T1.CODE1, T1.CODE2, T1.SOURCE, T1.OTHERCOLUMNS;

最后,这三个查询的结果被 UNION 到一个新的表 D 中。它必须再次与其他表连接以进行进一步的更新等......

理想情况下,唯一匹配和不匹配的记录必须在一个表中。每个表有超过 30,000 条记录。目前我正在使用INNER JOIN 查找匹配记录。然后使用另外两个单独的 NOT EXISTS 查询来获取不匹配的记录。在比较了 LEFT JOIN + NULL 和 DELETE 查询所花费的时间之后,这是我能想到的最合理的方法。然而,最后两个查询每个都需要 5 分钟以上。这根本无法忍受。

所以我希望我们的一些 SQL 专家可以为这个案例提供一些启示......以获得高效(更快)的解决方案。另外,我很确定,这是一种超级蛮力的方式,并且遗漏了一些东西。

【问题讨论】:

    标签: sql ms-access-2003


    【解决方案1】:

    你能用 GROUP BY 和 HAVING COUNT(*) 子句对这两个表进行 UNION ALL 吗?

    【讨论】:

    • 很高兴在这里看到提示。我做了一个 UNION ALL,没有 GROUP BY 和 HAVING COUNT(*)。在 UNION 上,我表演了 INNER。如果没记错的话,我并没有完全得到唯一记录,主要是因为两个表中的“其他列”并不相同。无论如何,让我试一试。
    猜你喜欢
    • 2017-04-24
    • 2016-01-05
    • 1970-01-01
    • 2015-10-19
    • 2017-05-26
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多