2014-10-20 7 views
2

У меня есть таблица с именем «Задача» с полями (Id int, TaskName nvarchar, AssigneeType int, AssigneeId int).Условная таблица Присоединиться к SQL Server

AssigneeType может содержать INT значения, указывающий на конкретные таблицы. (0 = Пользователь, 1 = группа, 2 = Место)

  • пользователя, группы, расположение являются таблицы

AssigneeId содержит идентификатор записи в таблице, указываемой AssigneeType.

Проблемная зона

Я хочу, чтобы извлечь все задачи, вступив таблицу задач с таблицей указываемой AssigneeType.

Если AssigneeType содержит 0, мне нужно присоединиться к таблице задач с таблицей пользователя.

Если AssigneeType содержит 1, мне нужно присоединиться к таблице задач с таблицей групп.

Если AssigneeType содержит 2, мне нужно присоединиться к таблице задач с таблицей местоположения.

В принципе, мне нужно сделать условное соединение. Я нашел this, но я не знаю, как я могу подключиться для своих нужд. Я хочу показать имя TaskName и поле Имя записи в столбце.

Любая помощь?

+0

Но что вы хотите показать в качестве своего результата? Задача плюс что? Пользователь не является группой, а группа не является местом. Таким образом, вы просто показываете имя (которое является либо именем пользователя, либо именем группы, либо именем местоположения)? Или что еще? –

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

Что делать, если в одной из таблиц нет поля имени, и мы хотим получить от него другое поле, например. описание? –

+0

Затем просто измените содержимое COALESCE, например, на «Location.Description» – DavidG

+0

. Я получаю Null в поле NAME после выполнения запроса –

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; 

EDIT: Я скорректировал свой ответ и заменил backticks скобками. Различные dbms используют разные символы, чтобы использовать зарезервированные слова, такие как «GROUP» для имен таблиц. В SQL Server это должны быть скобки, а не backticks. Однако всегда полезно использовать зарезервированные слова для имен таблиц и столбцов, поэтому вы можете изменить это, если сможете.

+0

Ха-ха очень похожа на мой ответ. Великие мысли тоже думают :) – DavidG

+0

@DavidG: Но вы были быстрее, и не только это: чтобы использовать зарезервированные слова в качестве имен таблиц, нужно использовать скобки, а не обратные ссылки в SQL Server, как ваш запрос правильно показывает. –

+0

Что делать, если одна из таблиц не имеет поля имени, и мы хотим получить из нее какое-то другое поле, например. описание? –

Смежные вопросы