簡體   English   中英

SQL Server-更好的解決方案,用於在2個表之間進行聯接以將行旋轉為列

[英]SQL Server - Better Solution for join between 2 tables pivoting rows into columns

大家好,我正在使用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個withs似乎效率很低,有沒有更好的解決方案? 我似乎找不到有效的方法

您只需要在第一個查詢上聚合:

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;

請注意,我還將表別名更改為表名的縮寫,而不是無意義的字母(例如AB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM