如何使用SQL Server在一行中检索特定id的多条记录
我有三张桌子如下 问题如何使用SQL Server在一行中检索特定id的多条记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有三张桌子如下 问题 issue_num issue_desc issue_status issue_date ----------------------------------------------------------------------- abc123 login issue 1 2017-03-15 00:00:00.000 abc345 session issue 1
issue_num issue_desc issue_status issue_date
-----------------------------------------------------------------------
abc123 login issue 1 2017-03-15 00:00:00.000
abc345 session issue 1 2017-03-15 00:00:00.000
abc334 logeger issue 1 2017-03-15 00:00:00.000
使用者
分配的问题
issue_num assigned_to_user_id comment assign_date
------------------------------------------------------------------------------------
abc123 1 replicating issue 2017-03-15 00:00:00.000
abc123 2 replicating issue 2017-03-15 00:00:00.000
abc345 2 replicating issue 2017-03-15 00:00:00.000
abc345 3 replicating issue 2017-03-15 00:00:00.000
abc334 3 replicating issue 2017-03-15 00:00:00.000
如果您签入Issue\u Assigned
表,某些问题将分配给2个用户。我想写一个查询,在我的预期结果中应该是
Issue_number issue_desc assigned_to_user_id comment assign_date
---------------------------------------------------------------------------------------------------------
abc123 login issue yash123,ray234 replicating issue 2017-03-15 00:00:00.000
abc345 session issue ray234,aniket replicating issue 2017-03-15 00:00:00.000
abc334 session issue aniket replicating issue 2017-03-15 00:00:00.000
使用
rextester演示:
返回:
+-----------+---------------+---------------------+-------------------+---------------------+
| issue_num | issue_desc | assigned_to_user_id | comment | assign_date |
+-----------+---------------+---------------------+-------------------+---------------------+
| abc123 | login issue | ray234,yash123 | replicating issue | 2017-03-15 00:00:00 |
| abc345 | session issue | aniket,ray234 | replicating issue | 2017-03-15 00:00:00 |
| abc334 | logeger issue | aniket | replicating issue | 2017-03-15 00:00:00 |
+-----------+---------------+---------------------+-------------------+---------------------+
感谢Gouri Shankar Aechoor编写样本数据。使用
rextester演示:
返回:
+-----------+---------------+---------------------+-------------------+---------------------+
| issue_num | issue_desc | assigned_to_user_id | comment | assign_date |
+-----------+---------------+---------------------+-------------------+---------------------+
| abc123 | login issue | ray234,yash123 | replicating issue | 2017-03-15 00:00:00 |
| abc345 | session issue | aniket,ray234 | replicating issue | 2017-03-15 00:00:00 |
| abc334 | logeger issue | aniket | replicating issue | 2017-03-15 00:00:00 |
+-----------+---------------+---------------------+-------------------+---------------------+
古里·尚卡尔·艾科霍撰写样本数据的功劳。这应该会给出所需的结果
select T2.issue_num, issue_desc, stuff((select ',' + cast(user_id as varchar(20))
from Users T1
where T1.id=T2.assigned_to_user_id
for xml path('')),1,1,'') userid,T2.comment,T2.assign_date
from IssueAssigned T2 inner join issues T3 on T2.issue_num=T3.issue_num
这应该会产生预期的结果
select T2.issue_num, issue_desc, stuff((select ',' + cast(user_id as varchar(20))
from Users T1
where T1.id=T2.assigned_to_user_id
for xml path('')),1,1,'') userid,T2.comment,T2.assign_date
from IssueAssigned T2 inner join issues T3 on T2.issue_num=T3.issue_num
试试看,应该没问题
select i.issue_num, i.issue_desc, iss.* from Issues i join
(select distinct a.issue_num, a.comment, a.assign_date, STUFF((
Select u.user_id + ',' AS assigner_to_user_id
From Issue_Assigned isu join Users u on isu.assigned_to_user_id = u.id
Where isu.issue_num = a.issue_num
ORDER BY u.id
For XML PATH (''), type).value('.','nvarchar(max)'
) ,1,1, '') as assigned_to_user_id
from Issue_Assigned a ) iss on i.issue_num = iss.issue_num
试试看,应该没问题
select i.issue_num, i.issue_desc, iss.* from Issues i join
(select distinct a.issue_num, a.comment, a.assign_date, STUFF((
Select u.user_id + ',' AS assigner_to_user_id
From Issue_Assigned isu join Users u on isu.assigned_to_user_id = u.id
Where isu.issue_num = a.issue_num
ORDER BY u.id
For XML PATH (''), type).value('.','nvarchar(max)'
) ,1,1, '') as assigned_to_user_id
from Issue_Assigned a ) iss on i.issue_num = iss.issue_num
希望这有帮助
;WITH cte_Issues(issue_num,issue_desc,issue_status,issue_date) AS
(
SELECT 'abc123','login issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc345','session issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc334','logeger issue','1','2017-03-15 00:00:00.000'
)
,cte_users(id,user_id,user_first_name,user_last_name,user_email_id) AS
(
SELECT 1,'yash123','yashn','ray','yash@gmail.com' UNION ALL
SELECT 2,'ray234','raah','kumar','raah@yahoo.com' UNION ALL
SELECT 3,'aniket','aniket','pal','aniket@yahoo.com'
)
,cte_IssueAssigned (issue_num,assigned_to_user_id,comment,assign_date) AS
(
SELECT 'abc123',1,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc123',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc334',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE)
)
,
cte_Staging AS (
SELECT ci.issue_num,
issue_desc,
user_id AS assigned_to_user_id,
comment,
issue_date
FROM cte_Issues ci
INNER JOIN cte_IssueAssigned cia
ON ci.issue_num = cia.issue_num
INNER JOIN cte_users cu
ON cu.id = cia.assigned_to_user_id
)
SELECT issue_num,
issue_desc,
STUFF((
SELECT ',' + b.assigned_to_user_id AS [text()]
FROM cte_Staging b
WHERE b.issue_num = a.issue_num
FOR XML PATH('')
), 1, 1, '') AS assigned_to_user_id,
comment,
issue_date
FROM cte_Staging a
希望这有帮助
;WITH cte_Issues(issue_num,issue_desc,issue_status,issue_date) AS
(
SELECT 'abc123','login issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc345','session issue','1','2017-03-15 00:00:00.000' UNION ALL
SELECT 'abc334','logeger issue','1','2017-03-15 00:00:00.000'
)
,cte_users(id,user_id,user_first_name,user_last_name,user_email_id) AS
(
SELECT 1,'yash123','yashn','ray','yash@gmail.com' UNION ALL
SELECT 2,'ray234','raah','kumar','raah@yahoo.com' UNION ALL
SELECT 3,'aniket','aniket','pal','aniket@yahoo.com'
)
,cte_IssueAssigned (issue_num,assigned_to_user_id,comment,assign_date) AS
(
SELECT 'abc123',1,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc123',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',2,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc345',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE) UNION ALL
SELECT 'abc334',3,'replicating issue',CAST('2017-03-15 00:00:00.000' AS DATE)
)
,
cte_Staging AS (
SELECT ci.issue_num,
issue_desc,
user_id AS assigned_to_user_id,
comment,
issue_date
FROM cte_Issues ci
INNER JOIN cte_IssueAssigned cia
ON ci.issue_num = cia.issue_num
INNER JOIN cte_users cu
ON cu.id = cia.assigned_to_user_id
)
SELECT issue_num,
issue_desc,
STUFF((
SELECT ',' + b.assigned_to_user_id AS [text()]
FROM cte_Staging b
WHERE b.issue_num = a.issue_num
FOR XML PATH('')
), 1, 1, '') AS assigned_to_user_id,
comment,
issue_date
FROM cte_Staging a
到目前为止你做了什么?提示:查看一些答案以创建实际的CSV列表。这是否假设如果分配了多个用户一个问题,他们将有相同的分配注释和分配日期?您可以选中accepted answer@DhruvJoshi no我刚刚编写了它例如,您到目前为止做了什么?提示:查看一些答案以创建实际的CSV列表。这是否假设如果分配了多个用户一个问题,他们将有相同的分配注释和分配日期?您可以检查accepted answer@DhruvJoshi no我刚刚编写了它,例如,此结果我分别得到2个rows@Suyash,这就是你需要的,对吗?你在你想要的输出中提到了3行。这个结果我得到了2个单独的结果rows@Suyash,这就是你需要的,对吗?您在所需输出中提到了3行。正在获取第4行中“=”的语法异常,第10行和as@Suyash更新了一个演示,我正在ms sql management studio中尝试运行相同的演示errors@Suyash很乐意帮忙!获取第4行中“=”的语法异常,第10行和as@Suyash更新了一个演示,我正在ms sql management studio中尝试运行相同的演示errors@Suyash很乐意帮忙!我将修复它,一分钟内设置syntex异常(从问题_分配a)预期为id或引用的idI已修复它,仅更改列和表名称,我已更改我的注释,请在上面查找匹配的案例,它显示了2行,并且正在删除userIdi的第一个字母表。我将修复它,一分钟设置syntex例外,从问题中(分配了a)预期为id或引用的idI已修复它,仅更改列和表的名称,我已经更改了我的注释,请在上面查找匹配的案例,它显示了2行,并且删除了userId的第一个字母