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_UtilisateurLogin
1Nico
2Philo
TaClients
Id_ClientEntreprise
0Company 1
4036Company 2
TaJoinClients_Utilisateurs
Id_JoinClient_UtilisateurId_UtilisateurId_ClientEditeurAdministrateur
110TrueTrue
214036TrueTrue
424036TrueTrue

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_UtilisateursON dbo.TaUtilisateurs.Id_Utilisateur = dbo.TaJoinClients_Utilisateurs.Id_Utilisateur RIGHT OUTER JOIN
dbo.TaClientsON dbo.TaJoinClients_Utilisateurs.Id_Client = dbo.TaClients.Id_Client
WHERE (dbo.TaUtilisateurs.Id_Utilisateur = @Id_Utilisateur)

for example for user philo :
LoginEntrepriseAdministrateurEditeurId_UtilisateurId_Client
PhiloCompany 2VraiVrai24036

How can I do to have all company listed like that:
LoginEntrepriseReadAdministrateurEditeurId_UtilisateurId_Client
PhiloCompany 1FalseFalseFalse24036
PhiloCompany 2TrueTrueTrue24036

Read mean a row exist inTaJoinClients_Utilisateurs for User and customer

I hope you can help me ...

thanks !

[10489 byte] By [Coroebus] at [2008-2-28]
# 1
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'

oj at 2007-9-9 > top of Msdn Tech,SQL Server,Transact-SQL...
# 2

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

Coroebus at 2007-9-9 > top of Msdn Tech,SQL Server,Transact-SQL...
# 3

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

oj at 2007-9-9 > top of Msdn Tech,SQL Server,Transact-SQL...
# 4
Great, it is exactly what i need !! thank you very much !!! Big Smile
Coroebus at 2007-9-9 > top of Msdn Tech,SQL Server,Transact-SQL...

SQL Server

Site Classified