2015-02-04 59 views
0

所以我有一個表,其中有一列Name,和一列ValueID。對於相同的ID可以有多行。我想創建一個select,它將爲每個ID返回一行,並且Name列中的值將是列名稱,並且Value將是值。例如:如何選擇兩列(名稱,值)並將其作爲單一結果返回?

CREATE TABLE dbo.Attribute 
(
    AttributeID int NOT NULL, 
    Name varchar(20) NOT NULL, 

    Value varchar(20) NOT NULL 
    ) ; 

數據:

{1,"Color", "Blue"},{1,"Material", "leather"} 

想選擇返回:

[AttributeID:1, Color:Blue, Material: leather] 

我一直在玩PIVOTUNPIVOT,但沒有得到我需要什麼。

+1

您可能希望對EAV數據庫模型的優缺點進行一些研究。 –

+1

是的尼克!我發現這是優秀的:http://www.sturnus.co.uk/performance/2008-07/the-curse-of-the-name-value-pair/ – n8wrl

+0

特別是缺點(如查詢能力)。這是存儲數據的一種可怕方式。 – HLGEM

回答

1

感謝@ Mihai的鏈接。我能夠做什麼我

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Name) 
      FROM VariantAttribute c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT variantid, ' + @cols + ' from 
      (
       select variantid 
        , Name 
        , value 
       from VariantAttribute 
      ) x 
      pivot 
      (
       max([Value]) 
       for Name in (' + @cols + ') 
      ) p ' 


execute(@query) 

在我如何存儲這些數據更加鬆懈之前。目前還沒有出路,但此查詢將這些數據推送到Azure搜索(使用彈性搜索)以便能夠輕鬆搜索此數據。

相關問題