我在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
10, A20, AA, x, y, etc
10, A50, AA, x, y, etc
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
第二次查询:
NOT Table A
和Table C on ID, Code 1, Code 2
之间的EXEXTS查询过滤掉匹配集中找不到的任何记录。
第三次查询:
NOT Table B
和Table C on ID, Code 1, Code 2
之间的EXEXTS查询过滤掉匹配集中找不到的任何记录。
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专家可以为这种情况提供一些启示...以获得有效(更快)的解决方案。另外我很确定,这是一种超级蛮力的方式而且缺少一些东西。
答案 0 :(得分:0)
你能用GROUP BY和HAVING COUNT(*)子句做两个表中的UNION吗?