SQL Server - лучшее решение для объединения двух таблиц, объединяющих строки в столбцы - PullRequest
0 голосов
/ 14 мая 2019

Привет всем, я использую SQL Server 2016, у меня есть таблица с именем support_event_log, которая выглядит следующим образом:

|    event_nr  |    data     |  
|--------------|-------------|
|     1        |       x     |
|     2        |       x     |

И таблица с именем support_event_log_params, которая выглядит следующим образом:

|      event_nr   |   msg_param_nr |  msg_param_value |  
|-----------------|----------------|------------------|
|        1        |        1       |        x         |
|        2        |        1       |        x         |
|        2        |        2       |        y         |
|        2        |        3       |        z         |

Я хочу объединить обе таблицы по столбцу Event_nr и развернуть столбец msg_param_nr в 3 различных столбца в зависимости от числа со значением столбца msg_param_value, например:

|      event_nr   | msg1 | msg2 | msg3 | data |  
|-----------------|------|------|------|   x  |
|        1        |  x   | null | null |   x  |
|        2        |  x   |  y   |   z  |   x  |

Сначала я попробовал следующий запрос:

SELECT A.event_nr 
      ,A.data
      ,CASE WHEN B.msg_param_nr = 1 THEN B.msg_param_value END AS msg1
      ,CASE WHEN B.msg_param_nr = 2 THEN B.msg_param_value END AS msg2
      ,CASE WHEN B.msg_param_nr = 3 THEN B.msg_param_value END AS msg3

FROM support_event_log A LEFT JOIN support_event_log_params B
  on A.event_nr=B.event_nr

, но я получил следующий результат с повторяющимися строками:

|      event_nr   | msg1 | msg2 | msg3 | data |  
|-----------------|------|------|------|   x  |
|        1        |  x   | null | null |   x  |
|        2        |  x   | null | null |   x  |
|        2        | null |  y   | null |   x  |
|        2        | null | null |   z  |   x  |

Наконец, после долгих раздумий я получил работуРешение с помощью следующего запроса:

WITH col1 AS (
     SELECT A.event_nr, A.msg_param_value
     FROM support_event_log_params A
     WHERE A.msg_param_nr=1
 )
, col2 AS (
     SELECT A.event_nr, A.msg_param_value
     FROM support_event_log_params A
     WHERE A.msg_param_nr=2
 )
,col3 AS (
     SELECT A.event_nr, A.msg_param_value
     FROM support_event_log_params A
     WHERE A.msg_param_nr=3
 )
SELECT A.event_nr 
      ,A.data
      ,B.msg_param_value as msg1
      ,C.msg_param_value as msg2
      ,D.msg_param_value as msg3
FROM support_event_log A 
  LEFT JOIN col1 B on A.event_nr=B.event_nr
  LEFT JOIN col2 C on A.event_nr=C.event_nr
  LEFT JOIN col3 D on A.event_nr=D.event_nr

но кажется, что неэффективно делать 3 с одной и той же таблицы, есть ли лучшее решение этой проблемы?Я не могу найти тот, который работает

1 Ответ

2 голосов
/ 14 мая 2019

Вам просто нужно агрегировать в первом запросе:

SELECT el.event_nr, el.data,
       MAX(CASE WHEN elp.msg_param_nr = 1 THEN elp.msg_param_value END) AS msg1,
       MAX(CASE WHEN elp.msg_param_nr = 2 THEN elp.msg_param_value END) AS msg2,
       MAX(CASE WHEN elp.msg_param_nr = 3 THEN elp.msg_param_value END) AS msg3
FROM support_event_log el LEFT JOIN
     support_event_log_params elp
     ON el.event_nr = elp.event_nr
GROUP BY el.event_nr, el.data;

Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они стали сокращениями для имен таблиц, а не бессмысленными буквами, такими как A и B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...