作为较大存储过程的一部分,我试图编写一条SQL命令以使用取决于某些条件的值来更新特定字段。我遇到的问题是如何将Joins与网上论坛联系起来。
涉及3个表,初始表保存存储过程中主记录的ID,并包含一个唯一值。
wrec_id
1
2
3
4
第二个表可能包含链接到主表的条目 Work_id,并充当通往人员表的路由。 如果它不包含值或pers_id的值设置为0,则我需要“未分配”作为“人员名称”。 如果分配了一个以上的人员,那么我需要所有人员的合并清单。
wrec_id, pers_id
1, 1
1, 2
2, 1
3, 3
Person表包含存储过程中所需的条目。
pers_id, Forename, Surname
1, For1, Sur1
2, For2, Sur2
3, For3, Sur3
以上示例的预期输出应如下所示:-
For1 Sur1 : For2 Sur2
For1 Sur1
For3 Sur3
Not Assigned
我尝试了组和联接的各种组合,但没有成功。
任何帮助都非常欢迎。
答案 0 :(得分:0)
在SQL Server中,可以使用XML PATH
表达式来组合多行。在这种情况下,您可以使用query here之类的东西来显示分配给每个工作项目的人员。然后,根据需要使用数据的方式,可以在SQL Server或调用应用程序中进行处理。例如,如果仅在调用应用程序中显示最终结果,则可以使用XSLT以所需的方式显示XML(如果采用这种方式,则可以将整个查询包装在FOR XML
表达式,并根据需要显示它。)
如果您绝对需要像在SQL Server中一样显示数据,则可以执行以下操作:
select
wrec_id
,case
when
( select
' : ' + Persons.Forename + ' ' + Persons.Surname
from WorkAssignments
inner join Persons on
Persons.pers_id = WorkAssignments.pers_id
where
WorkAssignments.wrec_id = WorkProjects.wrec_id
for xml path('')
) is null then 'Not Assigned'
else
( select
' : ' + Persons.Forename + ' ' + Persons.Surname
from WorkAssignments
inner join Persons on
Persons.pers_id = WorkAssignments.pers_id
where
WorkAssignments.wrec_id = WorkProjects.wrec_id
for xml path('')
)
end AssignedPersons
from WorkProjects
尽管,如您所见,它开始变得有点难看。同样,如果可以的话,您可能想保留如何显示对调用应用程序的工作分配的细节,而不是直接在SQL Server中完成。