我对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
的其他记录的记录。
答案 0 :(得分:1)
从GROUP BY
查询开始,该查询为您提供place
和date
的每个组合的计数...
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;
关于效果,您应该为place
和date
字段编制索引。如果demo
表真的很大,那么这个查询可能不会很快,但它应该比原始版本更快。
我建议您也将v.*
替换为您想要查看的字段列表。 v.*
需要两个步骤:首先找到与v.*
对应的字段名称;第二,检索这些字段的数据。因此列出字段名称消除了第一步。如果您只需要查看可用字段的子集,则按名称列出它们意味着数据库引擎要检索的数据更少。