gpt4 book ai didi

sql - 语法问题 SQL Server。结合 Pivot、XML 解析和 JOIN

转载 作者:太空狗 更新时间:2023-10-30 01:49:24 25 4
gpt4 key购买 nike

我在 SQL 表中有一列 (varchar400),格式如下:

Info
User ID=1123456,Item ID=6685642

此列用于存储我们数据库中产品的属性,因此虽然我只关心 User ID 和 Item ID,但此处可能存储了多余的信息,例如:

   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 或执行子查询来组合两个表,我不知道如何使用正确的语法来执行此操作。其次,我在上面的查询中写了一些评论,说明我如何理解查询的工作原理。它们正确吗?

最佳答案

很可能我遗漏了您的问题,但您似乎可以通过以下方式扩展现有查询。这仍然使用 CTE 和 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

关于sql - 语法问题 SQL Server。结合 Pivot、XML 解析和 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17338777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com