У меня есть выбор (MS SQL), где я присоединяюсь к родителям с тремя детьми. Я хотел бы выбрать всех детей, если ЛЮБОЙ из детей соответствует критериям (Тип <> «Готово»). Производительность очень важна.Выделить всех детей, если они соответствуют критериям
Я попытался
SELECT p.*,c.* FROM Parent p
INNER JOIN Child c ON p.Id=c.ParentId
WHERE p.Id IN (SELECT DISTINCT c.ParentId FROM Child c2 WHERE c2.ParentId=p.Id AND c2.Type<>'Done')
Но внутренний выбор часто возвращается 2000+ детей, поэтому IN дает плохую производительность. Я также попытался EXISTS и посчитайте:
SELECT p.*,c.* FROM Parent p
INNER JOIN Child c ON p.Id=c.ParentId
WHERE EXISTS(SELECT 1 FROM Child c2 WHERE c2.ParentId=p.Id AND c2.Type<>'Done')
SELECT p.*,c.* FROM Parent p
INNER JOIN Child c ON p.Id=c.ParentId
WHERE 0 < (SELECT COUNT(c2.Id) FROM Child c2 WHERE c2.ParentId=p.Id AND c2.Type<>'Done')
Все это возвращает правильный результат, но с плохой производительностью. Я думаю, что у меня есть все необходимые индексы.
У кого-нибудь есть альтернативы?
Какие индексы у вас есть? Индекс для Child.Type * может * увеличить производительность. – Karsten
У меня есть указатели на Child.Type и все ID. –