Из того, что я прочитал, Крис Тейшейра и Хова используют в основном ту же логику, но;
- Hova анализирует таблицы только один раз
- Крис Тейшейра разбирает таблицы несколько раз
=> Техника Ховы предпочтительна (на мой взгляд)
Однако, Хова сделал это немного неправильно ...
Логика должна быть:
- If Any 2 or 7 records => DENIED
- ElseIf Any NULL records => PENDING
- Else => ACCEPTED
Это дает следующий код ...
SELECT
[main].id,
CASE WHEN MAX(CASE WHEN [status].value IN (2,7) THEN 1 ELSE 0 END) = 1 THEN 'DENIED'
WHEN MAX(CASE WHEN [status].value IS NULL THEN 1 ELSE 0 END) = 1 THEN 'PENDING'
ELSE 'ACCEPTED' END
FROM
[main]
INNER JOIN
[status]
ON [main].id = [status].main_id
GROUP BY
[main].id
Кроме того, использование MAX, а не SUM (которое использовал Hova) означает, что механизм запросов должен находить только одно совпадение, а не несколько. Кроме того, оптимизатору проще использовать соответствующие индексы в таблице [status]. (В этом случае индекс будет (main_id, value) в указанном порядке в таблице [status].
Демс.
EDIT:
Нечто подобное может быть следующим. У меня нет экземпляра SQL для тестирования здесь, поэтому я не могу сказать вам, если это быстрее, но я представляю, что это может быть ...
SELECT
[main].id,
MIN(CASE WHEN [status].value IN (2,7) THEN -1 -- Denied
WHEN [status].value IS NULL THEN 0 -- Pending
ELSE 1 END) -- Accepted
FROM
[main]
INNER JOIN
[status]
ON [main].id = [status].main_id
GROUP BY
[main].id
EDIT:
Другой вариант - просто присоединиться к таблице сопоставления вместо использования операторов CASE.
DECLARE @map TABLE (
status_value INT,
status_result INT
)
INSERT INTO @map VALUES (1, 1)
INSERT INTO @map VALUES (2, -1)
INSERT INTO @map VALUES (6, 1)
INSERT INTO @map VALUES (7, -1)
INSERT INTO @map VALUES (NULL, 0)
SELECT
[main].id,
MIN([map].status_result)
FROM
[main]
INNER JOIN
[status]
ON [main].id = [status].main_id
INNER JOIN
@map AS [map]
ON [status].value = [map].status_value
OR ([status].value IS NULL AND [map].status_value IS NULL)
-- # This has been faster than using ISNULLs in my experience...
GROUP BY
[main].id