2014-10-20 69 views
2

我有一個名爲'任務'的表(Id int,TaskName nvarchar,AssigneeType int,AssigneeId int)。條件表加入SQL Server中

受讓人類型可以包含指向特定表的int值。 (0 =用戶,1 =組,2 =位置)

  • 用戶,組,位置是表

AssigneeId包含記錄的ID在通過AssigneeType指向的表。

問題區域

我想通過AssigneeType指向的表連接任務表中提取的所有任務。

如果AssigneeType包含0,我需要將用戶表加入任務表。

如果AssigneeType包含1,我需要將任務表連接到組表。

如果AssigneeType包含2,我需要將任務表與位置表連接起來。

基本上我需要有條件地加入。我找到了this,但我不知道如何爲我的需要合併。我想顯示TaskName和聯合表記錄的名稱字段。

任何幫助?

+0

但是,你想要顯示的結果是什麼?任務加什麼?用戶不是一個組,也不是一個組。所以你只是顯示一個名字(這是用戶名或組名或位置名)?還有什麼? – 2014-10-20 09:55:40

+0

是的,我只想顯示名字。 – 2014-10-20 09:56:41

回答

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 
+0

What如果其中一個表沒有名稱字段,我們想從其中獲取其他字段,例如描述? – 2014-10-20 10:27:54

+0

然後,只需將COALESCE的內容更改爲,例如'Location.Description' – DavidG 2014-10-20 10:29:22

+0

執行查詢後,我在NAME字段中得到空值 – 2014-10-20 10:30:34

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中,這應該是括號而不是反引號。但是,對錶名和列使用保留字總是一個壞主意,所以如果可以的話,你可能想要改變它。

+0

哈哈和我的答案非常相似。偉大的思想想象一樣:) – DavidG 2014-10-20 10:04:26

+0

@DavidG:但是你更快,不僅如此:爲了使用保留字作爲表名,必須使用括號而不是在SQL Server中反引號,因爲查詢正確顯示。 – 2014-10-20 10:11:52

+0

如果其中一個表沒有名稱字段,並且我們想從中獲取其他字段,例如描述? – 2014-10-20 10:28:20