SQL子查询优化Access

时间:2016-02-05 11:16:30

标签: sql ms-access optimization

我对SQL知之甚少,所以我希望下面的查询可以根据您的知识进行改进。事实是我的电脑无法处理这个查询,所以我想知道是否有更好的方法来做到这一点。

我的查询是:

SELECT 
    v.*, 
    IIF((SELECT COUNT(v2.pk) FROM demo v2 
         WHERE v.place = v2.place 
           AND v.date = v2.date) > 1, "Si", "No")
FROM demo AS v;

重点是标记具有相同place和相同date的其他记录的记录。

1 个答案:

答案 0 :(得分:1)

GROUP BY查询开始,该查询为您提供placedate的每个组合的计数...

SELECT v2.place, v2.date, COUNT(*) AS group_count
FROM demo AS v2 
GROUP BY v2.place, v2.date

然后,您可以将其用作子查询,然后将其加入demo表并将IIf表达式添加到顶级SELECT子句...

SELECT
    v.*, IIf(sub.group_count > 1, 'Si', 'No')
FROM
    demo AS v
    INNER JOIN
    (
        SELECT v2.place, v2.date, COUNT(*) AS group_count
        FROM demo AS v2 
        GROUP BY v2.place, v2.date
    ) AS sub
    ON v.place = sub.place AND v.date = sub.date;

关于效果,您应该为placedate字段编制索引。如果demo表真的很大,那么这个查询可能不会很快,但它应该比原始版本更快。

我建议您也将v.*替换为您想要查看的字段列表。 v.*需要两个步骤:首先找到与v.*对应的字段名称;第二,检索这些字段的数据。因此列出字段名称消除了第一步。如果您只需要查看可用字段的子集,则按名称列出它们意味着数据库引擎要检索的数据更少。