创建使用联接或组的更新语句

时间:2018-06-28 12:02:20

标签: sql join

作为较大存储过程的一部分,我试图编写一条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

我尝试了组和联接的各种组合,但没有成功。
任何帮助都非常欢迎。

1 个答案:

答案 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中完成。