Я бы хотел выбрать все строки из одной таблицы, которые соответствуют «одной или нескольким» строкам в другой таблице, наиболее эффективным способом.
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, но я не знаю, как они оптимизированы. Мне нужно, чтобы он сначала присоединился к таблице задач, а не к таблице идентификаторов, поэтому я не выполняю полное сканирование таблицы идентификаторов, которая очень велика и будет содержать множество несоответствий.