Вот что я придумала ...
SELECT
*
FROM Coupons C
WHERE C.OriginatorID NOT IN (
SELECT
DISTINCT C.OriginatorID
FROM Responses R
INNER JOIN Coupons C ON C.CouponID = R.CouponID
WHERE C.OriginatorID IN (
SELECT Originators FROM (
SELECT C.OriginatorID As Originators, Sum(R.Rejected) AS Rejections
FROM Responses R INNER JOIN Coupons C ON C.CouponID = R.CouponID
WHERE R.RespondentID = 1
GROUP BY C.OriginatorID
) AS RejectionTally
WHERE Rejections > 1
)
)
У него есть недостаток, заключающийся в дополнительном встроенном SELECT, но похоже, что большая часть снижения производительности происходит в тот момент, когда я пытаюсь исключить определенные идентификаторы OriginatorID из таблицы Coupons. Например, вручную введите исключение, например ...
SELECT * FROM Coupons WHERE OriginatorID <> 10
имеет тот же эффект. В тестовой таблице из 50 строк время обработки равно .27 с, в отличие от неограниченного запроса, который имеет время обработки .08 с.
Дополнительное встраивание происходит из-за того, что мне нужен один столбец для внешнего NOT IN (то есть идентификатора OriginatorID, который я пытаюсь исключить). Это означало, что мне сначала нужно было создать SUM, затем изолировать записи, SUM которых меньше критерия (1), а затем исключить эти записи.