none
Ayuda con relacionar 3 tablas con left join RRS feed

  • Pregunta

  • Hola 

    Tengo un problema con SQL. Quiero hacer la relación de 4 tablas (usuario, appuserFuncitonRelation, organizaciones, GroupCommerce) donde la organización está relacionada con groupCOmmerce y appuserFunctionRelation está relacionado con ambos y con el otro tiene el id de usuario. Lo que quiero hacer es traer el GroupCOmmerce que el usuario no tiene. ¿Cómo se puede hacer eso?

    Tengo estas tablas:

    User
    ID|Description
    1 |admin
    
    Organization
    ID|Description
    1 |TestOrg
    2 |TestOrg2
    
    CommerceGroup
    ID|Organization|Description
    1 |1 |TestGC
    2 |1 |TestGC2
    3 |1 |TestGC3
    4 |2 |TestGC4
    
    AppUserFunctionsRelation
    User|organization|CommerceGroup 
    1 |1 |1

    Con este resultado esperado:

    user|organization|commercegroup
    1 | 1 |2
    1 | 1 |3
    
    SELECT 
       [AppUserFunctionsRelation].[user],
       [CommerceGroup].Organization,
       [CommerceGroup].ID AS CommerceGroupID ,[CommerceGroup].Description AS CommerceGroupDescription
       FROM [AppUserFunctionsRelation] 
    right JOIN [CommerceGroup] ON CommerceGroup.Organization = AppUserFunctionsRelation.Organization AND AppUserFunctionsRelation.[GroupCommerce] = [CommerceGroup].ID
       WHERE AppUserFunctionsRelation.GroupCommerce IS NULL AND CommerceGroup.Organization IN ( SELECT Organizations.[ID] FROM AppUserFunctionsRelation 
       INNER JOIN Organizations ON Organizations.ID = AppUserFunctionsRelation.Organization
       WHERE AppUserFunctionsRelation.[User] = 11 
    )

    tengo eso pero no funciona como esperaba, gracias.

    martes, 27 de marzo de 2018 12:34

Todas las respuestas

  • Hola Binomio:

    Pero no entiendo muy bien porque haces un right join para esto.

    select a.usuario, c.organization, c.id, c.descripcion
     from appUserFunctionsRelation a inner join usuario u on a.usuario = u.id
    inner join organization o on a.organization = o.id
    inner join CommerceGroup c on c.organization = o.id
    
    where a.usuario = 1

    Por lo que te he entendido, solo tienes que navegar por las relaciones de las tablas directamente.

    No es esto?

    Un saludo

    martes, 27 de marzo de 2018 12:46
  • Hola Binomio:

    Pero no entiendo muy bien porque haces un right join para esto.

    select a.usuario, c.organization, c.id, c.descripcion
     from appUserFunctionsRelation a inner join usuario u on a.usuario = u.id
    inner join organization o on a.organization = o.id
    inner join CommerceGroup c on c.organization = o.id
    
    where a.usuario = 1

    Por lo que te he entendido, solo tienes que navegar por las relaciones de las tablas directamente.

    No es esto?

    Un saludo

    Si soy nuevo en sql, hace un dia que estoy luchando con esto y no puedo  sacar. 

    Primero tengo que sabaer que organuzacion tiene el usuario y luego con esa organizacion traer los grupos de comercios que el usuario no tiene

    Se me ocurrió algo como esto, pero no me trae lo que quiero  

    select *
    from  Organizations
    inner join AppUserFunctionsRelation r on r.Organization = Organizations.ID
    left join CommerceGroup cg on cg.Organization = r.Organization and cg.ID = r.GroupCommerce
    where r.[User] = 37

    Gracias por la ayuda 


    martes, 27 de marzo de 2018 12:53
  • ...Lo que quiero hacer es traer el GroupCommerce que el usuario no tiene. ¿Cómo se puede hacer eso?

    Intenta con la siguiente consulta:

    DECLARE @User int = 11;
    SELECT
    	@User,
    	o.[Description],
    	cg.Id,
    	cg.[Description]
    FROM 
    	CommerceGroup cg
    	INNER JOIN Organization o ON cg.Organization = o.Id
    WHERE NOT EXISTS (SELECT 1 FROM AppUserFunctionsRelation a 
            WHERE cg.Id = a.CommerceGroup AND a.[User] = @User)
    GO

    martes, 27 de marzo de 2018 13:33
  • Eso funciona, pero me trae todos los grupos de comercios que no tiene el  usuario, osea me trae los grupos comercios que no tiene de todas las organizaciones, yo lo que necesito es traer los grupos de comercios que no tiene el usuario sobre la organizacion que tiene relacionada

    Se entiende ? 

    Gracias por tomarte el tiempo 
    • Editado Binomio martes, 27 de marzo de 2018 13:41
    martes, 27 de marzo de 2018 13:41
  • ...Lo que quiero hacer es traer el GroupCommerce que el usuario no tiene. ¿Cómo se puede hacer eso?

    Intenta con la siguiente consulta:

    DECLARE @User int = 11;
    SELECT
    	@User,
    	o.[Description],
    	cg.Id,
    	cg.[Description]
    FROM 
    	CommerceGroup cg
    	INNER JOIN Organization o ON cg.Organization = o.Id
    WHERE NOT EXISTS (SELECT 1 FROM AppUserFunctionsRelation a 
            WHERE cg.Id = a.CommerceGroup AND a.[User] = @User)
    GO

    Gracias de todas formas
    martes, 27 de marzo de 2018 14:02
  • De acuerdo. 

    Prueba con los siguientes cambios:

    DECLARE @User int = 1;
    SELECT	
    	o.[Description],
    	cg.ID,
    	cg.[Description]
    FROM 
    	CommerceGroup cg
    	INNER JOIN Organization o ON cg.Organization = o.ID
    		AND EXISTS (SELECT 1 FROM AppUserFunctionsRelation a 
    			WHERE o.ID = a.Organization AND a.[User] = @User)
    WHERE NOT EXISTS (SELECT 1 FROM AppUserFunctionsRelation a 
    	WHERE cg.ID = a.CommerceGroup AND cg.Organization = a.Organization AND a.[User] = @User)
    GO


    martes, 27 de marzo de 2018 14:02
  • Gracias amigo era precisamente lo que necesitaba estuve dos dias con esto, mil gracias hermano

    Saludos !! 

    martes, 27 de marzo de 2018 14:22