我有一个名为'任务'的表,其中包含字段(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的名称字段。
任何帮助?
答案 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中,这应该是括号而不是反引号。但是,对表名和列使用保留字总是一个坏主意,所以如果可以的话,你可能想要改变它。