SQL Server: запрос, чтобы получить данные таблицы (количество) из другой таблицы как VIEW - PullRequest
0 голосов
/ 20 января 2019

У меня 4 таблицы, MASTER, TRANS1, TRANS2 и TRANS3. Я хочу получить количество USERID в таблице MASTER из таблиц TRANS1-3.

Здесь показаны таблицы для ссылок.

Мастер Таблица:

USERID      REF       
--------------------
  1         Alfa
  2         Beta
  3         Charlie
  4         Delta
  5         Echo

TRANS1 Таблица

Id   USERID
------------
1    1
2    1
3    2
4    3
5    5 

TRANS2 Таблица

Id   USERID
------------
1    2
2    3
3    4
4    5

Я хочу вернуться к другой таблице или посмотреть как это

USERID   COUNT_FROM_TRANS1    COUNT_FROM_TRANS2    COUNT_FROM_TRANS3
--------------------------------------------------------------------
1        2                    0                    1
2        1                    1                    2
3        1                    1                    3
4        0                    1                    4
5        1                    5                    5

Как это работает с SQL Server 2014?

1 Ответ

0 голосов
/ 20 января 2019

В этом случае коррелированные подзапросы могут быть простейшим решением:

select m.*,
       (select count(*) from trans1 t where t.user_id = m.user_id) as cnt1,
       (select count(*) from trans2 t where t.user_id = m.user_id) as cnt2,
       (select count(*) from trans3 t where t.user_id = m.user_id) as cnt3
from master m;

С индексом user_id в каждой из транс-таблиц производительность также должна быть очень хорошей.

Более каноническое решение будет использовать left join и несколько group by s:

select m.user_id,
       coalesce(t1.cnt, 0) as cnt1,
       coalesce(t2.cnt, 0) as cnt2,
       coalesce(t3.cnt, 0) as cnt3
from master m left join
     (select t.user_id, count(*) as cnt
      from trans1 t
      group by t.user_id
     ) t1
     on t1.user_id = m.user_id left join
     (select t.user_id, count(*) as cnt
      from trans2 t
      group by t.user_id
     ) t2
     on t2.user_id = m.user_id left join
     (select t.user_id, count(*) as cnt
      from trans3 t
      group by t.user_id
     ) t3
     on t3.user_id = m.user_id;

Первая версия проще в написании и в большинстве случаев может даже иметь лучшую производительность.

...