gpt4 book ai didi

sql-server - 一列多行 SQL Server

转载 作者:数据小太阳 更新时间:2023-10-29 02:51:27 26 4
gpt4 key购买 nike

我想在一列中连接多行。我在 Internet 上找到了很多示例,但对我不起作用。我做错了什么?

        SELECT UserID,  
STUFF((SELECT '; ' + Email.Email From Email where UserEmail.EmailID = Email.ID for xml path('')),1,1, '') AS Emails
From UserEmail
where UserID = 1

我还有这样的信息

UserID  Email
1 abc@yahoo.com
1 cde@gmail.com

--EDIT--

好的,我做了这个更改,但仍然有 2 行。如果我应用 distinct 这将解决我的问题,但为什么我必须使用 distinct。查询必须自行分组。

        SELECT UserID,  
STUFF(( SELECT '; ' + ea.Email
From Email ea inner join UserMail ue_inner on ue_inner.EmailID = ea.ID
where
ue_inner.UserID = ue.UserID
for xml path('')), 1, 1, '')
AS Email
From UserEmail ue
where UserID = 1

结果

UserID   Email 
1 abc@yahoo.com; cde@gmail.com
1 abc@yahoo.com; cde@gmail.com

最佳答案

不幸的是,SQL Server 没有正确的字符串连接,因此您不能在分组时连接字符串。所以有几种可能的解决方案。

1.如果您想为单个 ID 连接数据,您可以使用变量技巧:

declare @Emails varchar(max)

select @Emails = isnull(@Emails + ', ', '') + E.Email
from Email as E
inner join UserEmail as UE on UE.EmailID = E.EmailID
where UE.UserID = 1

select @Emails;

-----------------
abc@yahoo.com, cde@gmail.com

2.如果你想进行适当的分组,你可以使用xml技巧。因此,基本思想是 - 您获得不同的 UserID 作为 anchor 查询(使用 group by),然后在子查询中连接数据。重要的是正确地执行此操作,使用 for xml ... type 并将连接的字符串作为 .value(),这样特殊字符将被正确处理:

select
UE.UserID,
stuff(
(
select ', ' + TE.Email
from Email as TE
inner join UserEmail as TUE on TUE.EmailID = TE.EmailID
where TUE.UserID = UE.UserID
for xml path(''), type
).value('.', 'varchar(max)')
, 1, 2, '') as Emails
from UserEmail as UE
group by UE.UserID

请参阅带示例的 sql fiddle 演示: sql fiddle demo

关于sql-server - 一列多行 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057655/

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