Оптимизировать CASE Test в SQL Server - PullRequest
0 голосов
/ 27 января 2012

Мне интересно, есть ли способ оптимизировать следующий запрос SELECT.(Примечание: я набрал это при написании вопроса для несуществующих таблиц, и у меня может не быть правильного синтаксиса.)

Цель состоит в том, чтобы, если Таблица2 содержит какие-либо связанные строки, я хочу установить значение третьего столбца вколичество связанных строк в таблице 2.В противном случае, если Table3 содержит какие-либо связанные строки, я хочу установить в столбце количество связанных строк в Table3.В противном случае я хочу установить значение столбца в 0.

SELECT Id, Title,
    CASE
        WHEN EXISTS (SELECT * FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) THEN
            (SELECT COUNT(1) FROM Table2 t2 WHERE t2.RelatedId = Table1.Id)
        WHEN EXISTS (SELECT * FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) THEN
            (SELECT COUNT(1) FROM Table3 t3 WHERE t3.RelatedId = Table1.Id)
        ELSE 0
    END AS RelatedCount
    FROM Table1

Мне не нравится тот факт, что я в основном выполняю один и тот же запрос дважды (в двух случаях).Есть ли способ сделать то, что я хочу, выполняя запрос только один раз?

Обратите внимание, что это часть гораздо большего запроса с несколькими JOIN с и UNION с, поэтому нелегко выполнитьсовершенно другой подход.

1 Ответ

1 голос
/ 27 января 2012

Этот запрос должен работать намного лучше. Вы не просто выполняете один и тот же запрос дважды; поскольку они являются коррелированными подзапросами, они будут выполняться по одному разу на строку.

SELECT Id, Title,
    coalesce(t2.Count, t3.Count, 0) AS RelatedCount
    FROM Table1 t
left outer join (
    SELECT RelatedId, count(*) as Count
    FROM Table2
    group by RelatedId
) t2 on t1.Id = t2.RelatedId
left outer join (
    SELECT RelatedId, count(*) as Count
    FROM Table3
    group by RelatedId
) t3 on t1.Id = t3.RelatedId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...