SQL Назначить переменную в SELECT и сделать CASE с переменной - PullRequest
0 голосов
/ 06 октября 2018

Есть ли способ сделать что-то вроде этого

объявить переменную, присвоить ей значение в операторе выбора, а затем использовать его в регистре?

Что-то вроде этого

DECLARE @result BIGINT;

SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id)
CASE WHEN @result IS NULL THEN 0 ELSE @result END AS ColNAme
FROM T2 _t2

Идея состоит в том, что я хотел бы избегать повторного выполнения запроса на подсчет количества.

CASE 
WHEN (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) IS NULL THEN 0 
ELSE (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) END AS ColNAme

Я не хочу использовать функции.

Набор результатовдолжен содержать количество всех элементов T, имеющих ссылку T2 по идентификатору T2

ID | Count
2  |   0
4  |   12

1 Ответ

0 голосов
/ 06 октября 2018

Да, вы можете использовать переменную, определенную в одном select позже в скрипте.Но вы по-прежнему используете два select запроса (обратите внимание, что следующее не работает, поэтому прочитайте весь ответ):

DECLARE @result BIGINT;

SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id);

SELECT (CASE WHEN @result IS NULL THEN 0 ELSE @result END) AS ColNAme
FROM T2 _t2;

Примечания:

  • Первый запрос вернетошибка, потому что _t2 не определено.
  • Второй запрос должен просто использовать COALESCE(@result, 0).
  • @result никогда не будет NULL, потому что COUNT() никогда не возвращает NULL значение.Таким образом, второй запрос может быть просто select @result.
  • Возвращать одно и то же значение для каждой строки в T2 странно.Я полагаю, ваш запрос на самом деле более интересен.
  • Нет смысла использовать переменную, если только вам не понадобится значение позже в скрипте.

Итак, основываясь на желаемых результатахЯ думаю, вы просто хотите left join и group by:

select t2.id, count(t.id)
from t2 left join
     t 
     on t2.id = t.t2id
group by t2.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...