Friday, February 24, 2012

Complex Join

Hello,

I am blocked with a Join Request

I have 3 tables :
TaUtilisateurs store the users
TaClients store the customers
TaJoinClients_Utilisateurs store right of user on customers :

for example :

TaUtilisateurs Id_Utilisateur Login 1 Nico 2 Philo

TaClients Id_Client Entreprise 0 Company 1 4036 Company 2

TaJoinClients_Utilisateurs Id_JoinClient_Utilisateur Id_Utilisateur Id_Client Editeur Administrateur 1 1 0 True True 2 1 4036 True True 4 2 4036 True True


I wrote a stored procedure to display the rights of users on each customer :


SELECT dbo.TaUtilisateurs.Login, dbo.TaClients.Entreprise, dbo.TaJoinClients_Utilisateurs.Administrateur, dbo.TaJoinClients_Utilisateurs.Editeur,
dbo.TaUtilisateurs.Id_Utilisateur, dbo.TaClients.Id_Client
FROM dbo.TaUtilisateurs LEFT OUTER JOIN
dbo.TaJoinClients_Utilisateurs ON dbo.TaUtilisateurs.Id_Utilisateur = dbo.TaJoinClients_Utilisateurs.Id_Utilisateur RIGHT OUTER JOIN
dbo.TaClients ON dbo.TaJoinClients_Utilisateurs.Id_Client = dbo.TaClients.Id_Client
WHERE (dbo.TaUtilisateurs.Id_Utilisateur = @.Id_Utilisateur)

for example for user philo :

Login Entreprise Administrateur Editeur Id_Utilisateur Id_Client Philo Company 2 Vrai Vrai 2 4036


How can I do to have all company listed like that:

Login Entreprise Read Administrateur Editeur Id_Utilisateur Id_Client Philo Company 1 False False False 2 4036 Philo Company 2 True True True 2 4036


Read mean a row exist in TaJoinClients_Utilisateurs for User and customer

I hope you can help me ...

thanks !Here is one way:

select tu.Login,tc.Entreprise,case when tj.Id_Client=tc.Id_Client then 'True' else 'False' end [Read]
,case when tj.Id_Client=tc.Id_Client then tj.Administrateur else 'False' end [Administrateur]
,case when tj.Id_Client=tc.Id_Client then tj.Editeur else 'False' end [Editeur]
,tu.Id_Utilisateur
,tj.Id_Client
from TaUtilisateurs tu join TaJoinClients_Utilisateurs tj on tu.Id_Utilisateur=tj.Id_Utilisateur
cross join TaClients tc
where tu.Login='Philo'|||

It works fine with user philo but not with user Nico...

|||

So, it's both 'true' and 'false' you want. See if this helps:

declare @.login sysname
set @.login='Philo' --'Nico'

select *
from (
-- True
select tu.Login,tc.Entreprise,'True' [Read]
,tj.Administrateur [Administrateur]
,tj.Editeur [Editeur]
,tu.Id_Utilisateur
,tj.Id_Client
from TaUtilisateurs tu join TaJoinClients_Utilisateurs tj on tu.Id_Utilisateur=tj.Id_Utilisateur
join TaClients tc on tj.Id_Client=tc.Id_Client
union all
-- False
select tu.Login,tc.Entreprise,'False' [Read]
,'False' [Administrateur]
,'False' [Editeur]
,tu.Id_Utilisateur
,tc.Id_Client
from TaClients tc join TaUtilisateurs tu on not exists(select *
from TaJoinClients_Utilisateurs tj
where tu.Id_Utilisateur=tj.Id_Utilisateur and tj.Id_Client=tc.Id_Client)
)_v
where Login=@.login

|||Great, it is exactly what i need !! thank you very much !!! Big Smile

No comments:

Post a Comment