我想以最有效的方式从一个表中选择与另一个表中的“一个或多个”行匹配的所有行。
SELECT identity.id FROM identity
INNER JOIN task ON
task.identityid=identity.id
AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)
目前,如果有多个匹配任务,这会多次返回相同的身份(但稍后消除这些的性能损失并不算太糟糕)。我希望它只为每个身份返回一行,它与这些任务组中的一个或多个匹配,我想知道是否有比 DISTINCT 或 GROUP BY 更有效的方法。
使用 DISTINCT 或 GROUP BY 的问题在于,仍然会扫描任务表以查找所有 groupid 匹配项,然后通过临时表(有时使用文件排序)将它们减少为一个。我宁愿它进行某种短路评估-在找到相同身份后,不要进一步追求任何后续任务匹配。
我正在考虑做一个 EXISTS 子查询,但我不知道这些是如何优化的。我需要它在身份表之前先加入任务表,所以我没有对身份表进行全面扫描,该表非常大并且会有很多不匹配。