条件表加入SQL Server

时间:2014-10-20 09:49:02

标签: sql sql-server

我有一个名为'任务'的表,其中包含字段(Id int,TaskName nvarchar,AssigneeType int,AssigneeId int)。

AssigneeType 可以包含指向特定表的 3 int值。 (0 =用户,1 =组,2 =位置)

  • 用户,组,位置是表格

AssigneeId包含AssigneeType指向的表中的记录ID。

问题区域

我想通过将任务表与AssigneeType指向的表连接来提取所有任务。

如果AssigneeType包含0,我需要将User表与User表连接。

如果AssigneeType包含1,我需要将Task表与Group表连接。

如果AssigneeType包含2,我需要将Task表与Location表连接。

基本上我需要有条件地加入。我找到了this,但我不知道我如何能够根据自己的需要加入。我想显示TaskName和Joined Table Record的名称字段。

任何帮助?

2 个答案:

答案 0 :(得分:0)

这将执行左连接,并使用COALESCE

为您找到它找到的第一个名称
SELECT Task.*, COALESCE([User].Name, [Group].Name, Location.Name) AS Name
FROM Task
LEFT JOIN  [User] 
    ON [User].Id = Task.AssigneeId
    AND Task.AssigneeType = 0
LEFT JOIN  [Group] 
    ON [Group].Id = Task.AssigneeId
    AND Task.AssigneeType = 1
LEFT JOIN Location  
    ON Location.Id = Task.AssigneeId
    AND Task.AssigneeType = 2

答案 1 :(得分:0)

您无法加入表格。您必须加入所有表格。所以你将外部加入三个表只获得一个匹配。然后显示与COALESCE匹配。

select t.*, coalesce(u.name, g.name, l.name) as name
from task t
left join user u on t.assigneetype = 0 and t.assigneeid = u.id
left join [group] g on t.assigneetype = 1 and t.assigneeid = g.id
left join location l on t.assigneetype = 2 and t.assigneeid = l.id;
编辑:我已经纠正了我的答案并用括号替换了反引号。不同的dbms使用不同的符号,以便为表名使用诸如'GROUP'之类的保留字。在SQL Server中,这应该是括号而不是反引号。但是,对表名和列使用保留字总是一个坏主意,所以如果可以的话,你可能想要改变它。