2013-06-27 2 views
7

У меня есть столбец (varchar400) в следующем виде в таблице SQL:Проблема с синтаксисом SQL Server. Объединение Pivot, XML парсер и РЕГИСТРИРУЙТЕСЬ

Info 
User ID=1123456,Item ID=6685642 

Этот столбец используется для хранения атрибутов продуктов в нашей базе данных, и поэтому, пока я касается только с идентификатором пользователя и идентификатором, может быть лишней информацией, хранящаяся здесь, например:

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

и поэтому я запрос SQL следующим образом:

-- 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 

Теперь, это правильно возвращает мне столбцы следующим образом:

UserID 
1 
2 
3 
4 
5 

Теперь у меня есть еще один стол, Table2, который содержит заказы пользователь сделал. Я хочу использовать UserID в качестве ссылки в этой таблице, и вместо того, чтобы возвращать только UserID, я верну строки в этой таблице, где возвращаемый выше идентификатор UserID равен строкам в этой таблице.

Таким образом, вместо того, чтобы выше, мы получаем:

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

2 вопроса - как я могу выполнить JOIN или сделать подзапрос, чтобы объединить две таблицы, я не могу понять, как сделать это с правильным синтаксисом , Во-вторых, я написал несколько комментариев по моему запросу выше, которые показывают, как я понимаю, что запрос должен работать. Правильны ли они?

ответ

4

Возможно, что у меня что-то не хватает на ваш вопрос, но похоже, что вы можете просто расширить существующий запрос следующим образом. Это по-прежнему использует КТР и PIVOT, но запрос PIVOT помещается в подзапрос, который позволяет присоединиться к table2:

; 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; 

См SQL Fiddle with Demo

+0

Спасибо за это! Поставит это на проверку сегодня, но это выглядит хорошо :). Правильны ли мои комментарии? –

+0

Пойду с этим ответом .. – MarmiK