Requête TSQL avec plusieurs jeux de résultats

J'ai 3 tables où une identification peut être dans le tableau 1, le tableau 2, le tableau 3 ou dans les deux arrays 1 et 3.

Ce que je dois faire est de passer l'ID à la procédure stockée en tant que paramètre, puis vérifier les 3 tables et returnner un set de résultats où l'ID est trouvé dans 1 des 3 tables.

Dans le cas où l'ID est trouvé à la fois dans la table 1 et dans la table 3, je dois returnner le jeu de résultats pour le tableau 3.

Toutes les tables ne contiennent pas le même nombre de colonnes. Je n'arrive pas à le faire correctement.

Ceci est ma procédure stockée jusqu'à présent:

ALTER PROCEDURE [dbo].[Login] @userId varchar(20) AS BEGIN SET NOCOUNT ON; -- Customer Service User IF EXISTS ( SELECT cs.id, first_name, last_name, logins.[email_address], logins.[password], phone, shift, manager, location FROM customer_service cs INNER JOIN logins ON cs.id = logins.[id] WHERE cs.id = logins.[id] ) -- Marketing User IF EXISTS ( SELECT mktg.id, first_name, last_name, logins.[email_address], logins.[password], phone, manager, location FROM marketing mktg INNER JOIN logins ON mktg.id = logins.[id] WHERE mktg.id = logins.[id] ) -- Remote User IF EXISTS ( SELECT ru.id, first_name, last_name, logins.[email_address], logins.[password], manager, location FROM remote ru INNER JOIN logins ON ru.id = logins.[id] WHERE ru.id = logins.[id] ) 

Vous voulez que le proc stocké returnne les mêmes colonnes, quelle que soit la table d'où proviennent datatables, donc j'unirais set les instructions select et utiliser NULL pour les noms de colonnes qui ne sont pas dans une table donnée. Puisque vous ne voulez renvoyer un logging de la première table que si l'ID n'existe pas dans la troisième table, j'ai ajouté cela à la première clause where :

 ALTER PROCEDURE [dbo].[Login] @userId varchar(20) AS BEGIN SET NOCOUNT ON; -- Customer Service User SELECT cs.id, first_name, last_name, logins.[email_address], logins.[password], phone, shift, manager, location FROM customer_service cs INNER JOIN logins ON cs.id = logins.[id] WHERE cs.id = @userId and not exists(select 1 from remote where id = @userId) union all -- Marketing User SELECT mktg.id, first_name, last_name, logins.[email_address], logins.[password], phone, null as shift, manager, location FROM marketing mktg INNER JOIN logins ON mktg.id = logins.[id] WHERE mktg.id = @userId union all -- Remote User SELECT ru.id, first_name, last_name, logins.[email_address], logins.[password], null as phone, null as shift, manager, location FROM remote ru INNER JOIN logins ON ru.id = logins.[id] WHERE ru.id = @userId end