取消激活数据时如何保留索引(sql server)

o4tp2gmn  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(326)

我正在尝试将一个表解压为eav格式,但希望在每一行保留一些额外的元数据。
初始表

  1. | Brand | Name | Number | Col1 | Col2 |
  2. |-------|----------|--------|------|------|
  3. | A | Book | #1 | 1 | 2 |
  4. | B | Magazine | #2 | 1 | 2 |

期望输出

  1. | Number | key | val |
  2. |--------|-------|----------|
  3. | #1 | Brand | A |
  4. | #1 | Name | Book |
  5. | #1 | Col1 | 1 |
  6. | #1 | Col2 | 2 |
  7. | #2 | Brand | B |
  8. | #2 | Name | Magazine |
  9. | #2 | Col1 | 1 |
  10. | #2 | Col2 | 2 |

实际产量
列名“number”无效。
示例查询

  1. select
  2. [Number], -- How can this be selected?
  3. [key],
  4. [val]
  5. from (
  6. select
  7. [Number],
  8. [Brand],
  9. [Name]
  10. from [SomeTable]
  11. ) data
  12. unpivot (
  13. [val]
  14. for [key] in (
  15. [Brand],
  16. [Name],
  17. [Number],
  18. [Col1],
  19. [Col2]
  20. )
  21. ) as unpiv

如何选择键值对以及相应的数字作为索引?

bvk5enib

bvk5enib1#

你可以使用 CROSS APPLY 配合一点xml
如果是2016+的话,就有一种json方法,它的性能更高
例子

  1. Declare @YourTable Table ([Brand] varchar(50),[Name] varchar(50),[Number] varchar(50),[Col1] int,[Col2] int)
  2. Insert Into @YourTable Values
  3. ('A','Book','#1',1,2)
  4. ,('B','Magazine','#2',1,2)
  5. Select A.Number
  6. ,C.*
  7. From @YourTable A
  8. Cross Apply ( values ( convert(xml,(select a.* for xml raw ) ) ) ) B(XMLData)
  9. Cross Apply (
  10. Select [key] = xAttr.value('local-name(.)', 'varchar(100)')
  11. ,Value = xAttr.value('.','varchar(max)')
  12. From B.XMLData.nodes('//@*') xNode(xAttr)
  13. Where xAttr.value('local-name(.)', 'varchar(100)') not in ('Number')
  14. ) C

退货

  1. Number key value
  2. # 1 Brand A
  3. # 1 Name Book
  4. # 1 Col1 1
  5. # 1 Col2 2
  6. # 2 Brand B
  7. # 2 Name Magazine
  8. # 2 Col1 1
  9. # 2 Col2 2

编辑-添加json版本if 2016+

  1. Select A.Number
  2. ,B.*
  3. From @YourTable A
  4. Cross Apply (
  5. Select [Key]
  6. ,Value
  7. From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper ))
  8. Where [Key] not in ('Number')
  9. ) B
展开查看全部

相关问题