2013-06-27 12 views
7

JOIN:Sözdizimi sorunu SQL Server. Pivot, XML parse birleştiren ve ben bir SQL tablosu aşağıdaki biçimde bir sütun (varchar400) sahip

Info 
User ID=1123456,Item ID=6685642 

Bu sütun veri tabanımızda ürünlerin özelliklerini saklamak için kullanılır ve bu yüzden olduğum sürece

Info 
    Irrelevant ID=666,User ID=123124,AnotherIrrelevantID=1232342,Item ID=1213124 

ve bu yüzden bir SQL sorgusu aşağıdaki gibi:

-- convert info column to xml type 
; with cte as --imports a library of common table expressions 
(
    select TOP 1000 cast('<info ' + REPLACE(REPLACE(REPLACE(REPLACE(OtherInformation,' ', ''),',', '" '),'=','="'),'.','') + '" />' as XML) info, --puts the OtherInformation column into well formed XML 
    ROW_NUMBER() over (order by TableID) id --returns all rows?? 
    FROM Table 
    WHERE TableEnum=51 
) 
SELECT DISTINCT UserID from --selects unique user ids from our returned xml 
(
     select T.N.value('local-name(.)', 'varchar(max)') as Name, --selects all attributes returned in varchar(max) format as Name 
     T.N.value('.', 'varchar(max)') as Value, id --Selects all values returned 
     from cte cross apply info.nodes('//@*') as T(N) -- from the XML we created above 
) v 
pivot (max(value) for Name in ([UserID])) p --creates a pivot table on Name, separating all of the attributes into different columns 
yalnızca Kullanıcı kimliği ve Öğe kimliği ile ilgili, örneğin burada saklanır gereksiz bilgiler olabilir aşağıdaki gibi 0'in

Şimdi, bu doğru bana bir sütun döndürür:

UserID 
1 
2 
3 
4 
5 

Şimdi bir Kullanıcının yaptığı siparişleri tutan başka bir masa, Table2 var. UserID'yi bu tabloya bir başvuru olarak kullanmak istiyorum ve bu nedenle yalnızca UserID değerini döndürmek yerine, bu tablodaki satırları döndürürüm, yukarıda döndüğüm UserID bu satırdaki satırlara eşittir.

Yani, yerine yukarıdaki, elde ederiz:

UserID Table2Col Table2Col2 
2    Info  Info 
5    Info  Info 
5    Info2  Info2 
5    Info3  Info3 

2 soru - nasıl gerçekleştirebilir JOIN veya iki tablo birleştirmek için bir alt sorgu yap, ben doğru sözdizimi ile bunu nasıl bilemiyorum . İkincisi, yukarıdaki sorguda çalışmanın sorgusunu nasıl anladığımı gösteren bazı yorumlar yazdım. Onlar doğru mu?

cevap

4

Sorunuzla ilgili bir şeyi kaçırmam oldukça olasıdır, ancak mevcut sorgunuzu şu şekilde genişletebilirsiniz. Bu hala CTE ve PIVOT kullanır, ancak MİL sorgusu table2 katılmak sağlayan bir alt sorgu yerleştirilir:

; with cte as --imports a library of common table expressions 
(
    select TOP 1000 cast('<info ' + REPLACE(REPLACE(REPLACE(REPLACE(OtherInformation,' ', ''),',', '" '),'=','="'),'.','') + '" />' as XML) info 
     , ROW_NUMBER() over (order by TableID)) id 
    FROM yourtable 
) 
select d.userid, t2.col1, t2.col2 
from 
(
    SELECT DISTINCT UserID 
    from 
    (
    select T.N.value('local-name(.)', 'varchar(max)') as Name, 
     T.N.value('.', 'varchar(max)') as Value, id 
    from cte 
    cross apply info.nodes('//@*') as T(N) 
) v 
    pivot 
    (
    max(value) 
    for Name in ([UserID]) 
) p 
) d 
inner join table2 t2 
    on d.userid = t2.userid; 

Bunun SQL Fiddle with Demo

+0

Teşekkür bakın! Bu gece sınava girecek, ama bu iyi görünüyor :). Yukarıdaki yorumlar doğru mu? –

+0

Bu cevapla gideceğim .. – MarmiK

İlgili konular