如何根据合并的列将列与后续联接合并?

  • 本文关键字:合并 接合 何根 sql sql-server
  • 更新时间 :
  • 英文 :


如何将许多(和不同的(单元格从一行合并到具有较少单元格的多行?
在那里我得到了一半的答案,因为在该步骤之后,在关于该数据的合并数据之上有一个表可以连接。 所以现在,例如,有 2 张表,MainTableTypes(我从中获取Id
并从(MainTable

(:
Name | Date       | Type_0 | Mess_0 | Type_1 | Mess_1 | Type_2 | Mess_2 
"AD" | 2018-03-02 | "error"| "mess" | "warn" | "mess" | "info" | "mess"

至(MainTable(:

Name | Date       | Type   | Mess   | TypeId
"AD" | 2018-03-02 | "error"| "mess" | 1
"AD" | 2018-03-02 | "warn" | "mess" | 2
"AD" | 2018-03-02 | "info" | "mess" | 3

TypeId从表Types获得。
Type_X列的名称在Types中具有IdDescription
最终查询如下所示:

SELECT Name,Date,Type,Mess,T.Id
FROM   MainTable
CROSS APPLY
(
SELECT Type = Type_0, Mess = Mess_0, ColName = 'Type_0'
UNION ALL
SELECT Type = Type_1, Mess = Mess_1, ColName = 'Type_1'
UNION ALL
SELECT Type = Type_2, Mess = Mess_2, ColName = 'Type_2'
) TM
INNER JOIN Types T
ON TM.ColName LIKE T.Description + '%'

如果没有最后一个内部连接,我得到了我想要的,但是在最后一个内部连接之后,我得到了最后一个联合的三重副本:

SELECT Type = Type_2, Mess = Mess_2, ColName = 'Type_2'

这会搞砸一切,例如:

Name | Date       | Type   | Mess   | TypeId
"AD" | 2018-03-02 | "error"| "mess" | 1
"AD" | 2018-03-02 | "warn" | "mess" | 2
"AD" | 2018-03-02 | "info" | "mess" | 3
"AD" | 2018-03-02 | "info" | "mess" | 3
"AD" | 2018-03-02 | "info" | "mess" | 3

有人有头绪吗?



附言:可应要求提供Types表:

Id | Description
1  | 'HVaR_3Y_6M'
2  | 'HVaR_3Y_1Y'
3  | 'HVaR_3Y'

问题显然是HVaR_3Y是所有三个描述的前缀,因此与其他两个描述不同,它匹配了三次。

也许最后一行在"类型"表中有多个匹配项。如果希望交叉应用(主表和 TM(的结果保持不变,无论"类型"表中的内容如何,请使用左连接:

SELECT Name,Date,Type,Mess,T.Id
FROM   MainTable
CROSS APPLY
(
SELECT Type = Type_0, Mess = Mess_0, ColName = 'Type_0'
UNION ALL
SELECT Type = Type_1, Mess = Mess_1, ColName = 'Type_1'
UNION ALL
SELECT Type = Type_2, Mess = Mess_2, ColName = 'Type_2'
) TM
LEFT JOIN Types T
ON TM.ColName LIKE T.Description + '%'

最新更新