Привет всем, я использую 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 с одной и той же таблицы, есть ли лучшее решение этой проблемы?Я не могу найти тот, который работает