Table conditionnelle Join In SQL Server

J'ai une table nommée ' Task ' avec des champs (Id int, TaskName nvarchar, AssigneeType int, AssigneeId int).

AssigneeType peut contenir 3 valeurs int pointant vers des tables spécifiques. (0 = Utilisateur, 1 = Groupe, 2 = Lieu)

  • Utilisateur, Groupe, Emplacement sont les tables

AssigneeId contient l'ID de l'logging dans la table pointée par AssigneeType.

Problème

Je veux extraire toutes les tâches en joignant la table des tâches avec la table pointée par AssigneeType.

Si AssigneeType contient 0, j'ai besoin de joindre la table des tâches avec la table user.

Si AssigneeType contient 1, j'ai besoin de joindre la table des tâches avec la table de groupe.

Si AssigneeType contient 2, j'ai besoin de joindre la table des tâches avec la table Location.

Fondamentalement, je dois faire conditionnellement join. J'ai trouvé ceci , mais je ne sais pas comment je peux incorporer pour mon besoin. Je souhaite afficher le champ Nom de la tâche et du nom de l'logging de table joint.

De l'aide?

Cela fera une jointure à gauche et vous donnera le prénom qu'il trouve en utilisant 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 

Vous ne pouvez pas join une table ou pas. Vous devez join toutes les tables. Donc, vous allez join les trois tables en obtenant un seul match. Puis montrez ce match avec 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: J'ai corrigé ma réponse et remplacé les backticks avec des crochets. Différents dbms utilisent des symboles différents afin d'utiliser des mots réservés tels que 'GROUP' pour les noms de table. Dans SQL Server, il devrait s'agir de crochets plutôt que de backticks. Cependant, il est toujours une mauvaise idée d'utiliser des mots réservés pour les noms de table et les colonnes, donc vous pourriez vouloir changer ceci, si vous le pouvez.