none
Consulta SQL entre varias tablas RRS feed

  • Pregunta

  • Hola buenas tardes, estoy tratando de armar un query que me permita saber si un usuario existe en varias ciudades, necesito que al indicarle solamente el nombre del usuario (el cual es el mismo para todas las ciudades), el me diga si existe en otras ciudades y que tome datos como el nombre y apellido de una tabla (tablaEmpleados) que se encuentra en otra base de datos llamada Empleados.

    Las ciudades están representadas como bases de datos, tengo la ciudad CA,SA y BR, las 3 cuentan con las mismas tablas (tablaUsuarios) donde se guardan datos del usuario como por ejemplo el Documento de identidad, el problema es que algunos registros cuentan con el Documento de identidad definido y otros no. La salida que quisiera es algo como lo siguiente:

    Nombre Usuario Nombre Apellido Documento de identidad CA SA BR
    wolfteam20 Pepe Lopez 123456789 Si No Si

    Por favor si me pudieran ayudar o darme una guia de como armarlo 

    lunes, 22 de mayo de 2017 23:20

Respuestas

  • Hola 

    Inténtalo de la siguiente forma:

    El Left Join cruzará los datos de las tablas que existen en las bases, de no existir tendrás null, por ello ponemos en la condición de Case 'NO', recuerda que en el left join estaría predominando tu base Empleados que por lo que tengo entendido es la principal:

    Select E.nombre,E.apellido, 
    Case when C.codigousuario is null then 'NO' else 'SI'end as CA,
    Case when S.codigousuario is null then 'NO' else 'SI'end as SA,
    Case when B.codigousuario is null then 'NO' else 'SI'end as BR
    from Empleados.TablaEmpleados E 
    left join CA.TablaEmpleados C on E.codigousuario = C.codigousario
    left join SA.TablaEmpleados S on E.codigousuario = S.codigousuario 
    left join BR.TablaEmpleados B on E.codigousuario = B.Codigousuario
    where E.codigousuario = '12345' --usuario en consulta
           

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    lunes, 22 de mayo de 2017 23:34
  • Entonces no basta con combinar las filas de las tablas SA, CA y BR. Te propongo lo siguiente:

    SELECT
        e.docIdentidad, e.nombre, e.apellido,
        MAX(CASE WHEN t.Origen = 'CA' THEN 'SI' ELSE 'NO' END) AS [CA],
        MAX(CASE WHEN t.Origen = 'SA' THEN 'SI' ELSE 'NO' END) AS [SA],
        MAX(CASE WHEN t.Origen = 'BR' THEN 'SI' ELSE 'NO' END) AS [BR]
    FROM
        Empleados e
        INNER JOIN
        (
    	   SELECT t1.nombreusuario, MAX(t1.docIdentidad) OVER() AS [docIdentidad], t1.Origen
    	   FROM (
    		  SELECT nombreusuario, docIdentidad, 'CA' [Origen] FROM CA.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario
    		  UNION ALL
    		  SELECT nombreusuario, docIdentidad, 'SA' [Origen] FROM SA.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario
    		  UNION ALL
    		  SELECT nombreusuario, docIdentidad, 'BR' [Origen] FROM BR.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario) t1
        ) t ON e.docIdentidad = t.docIdentidad
    GROUP BY
        e.docIdentidad, e.nombre, e.apellido;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Wolfteam20 miércoles, 7 de junio de 2017 1:58
    martes, 6 de junio de 2017 17:33

Todas las respuestas

  • Hola 

    Inténtalo de la siguiente forma:

    El Left Join cruzará los datos de las tablas que existen en las bases, de no existir tendrás null, por ello ponemos en la condición de Case 'NO', recuerda que en el left join estaría predominando tu base Empleados que por lo que tengo entendido es la principal:

    Select E.nombre,E.apellido, 
    Case when C.codigousuario is null then 'NO' else 'SI'end as CA,
    Case when S.codigousuario is null then 'NO' else 'SI'end as SA,
    Case when B.codigousuario is null then 'NO' else 'SI'end as BR
    from Empleados.TablaEmpleados E 
    left join CA.TablaEmpleados C on E.codigousuario = C.codigousario
    left join SA.TablaEmpleados S on E.codigousuario = S.codigousuario 
    left join BR.TablaEmpleados B on E.codigousuario = B.Codigousuario
    where E.codigousuario = '12345' --usuario en consulta
           

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    lunes, 22 de mayo de 2017 23:34
  • hola gracias por tu respuesta, en mi caso no cuento con el "codigousuario" (que vendria siendo en mi caso el documento de identidad el cual lo relaciona con sus datos personales en la tabla Empleados), lo único que tengo es el nombre del usuario (por ejemplo wolfteam20) el cual solo existe en las tablas usuarios de las bases de datos  CA,SA y BR 
    martes, 30 de mayo de 2017 0:46
  • Hola Wolfteam20

    Entonces ahí relacionarías por el nombreusuario:

    Select	E.nombre,E.apellido, 
    		Case when C.nombreusuario is null then 'NO' else 'SI'end as CA,
    		Case when S.nombreusuario is null then 'NO' else 'SI'end as SA,
    		Case when B.nombreusuario is null then 'NO' else 'SI'end as BR
    from	Empleados.TablaEmpleados E 
    		left join CA.TablaEmpleados C on E.nombreusuario = C.nombreusuario
    		left join SA.TablaEmpleados S on E.nombreusuario = S.nombreusuario 
    		left join BR.TablaEmpleados B on E.nombreusuario = B.nombreusuario
    where	E.nombreusuario = 'wolfteam20' --usuario en consulta

    Saludos



    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 30 de mayo de 2017 15:25
  • Ese es el detalle, que en Empleados.TablaEmpleados E no se encuentra el campo nombreusuario D:, solo esta disponible en CA.TablaEmpleados , SA.TablaEmpleados y BR.TablaEmpleados 
    • Editado Wolfteam20 viernes, 2 de junio de 2017 12:14
    viernes, 2 de junio de 2017 12:14
  • Entonces, ¿cuál es el campo común entre la tabla Empleado y las tablas CA, SA y BR?, las relaciones se basan en columnas cuyos valores puedan intersectar entre sí, lo ideal es buscar la igualdad aunque podrías buscar coincidencia o aproximación, ¿alguna pista?



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 2 de junio de 2017 14:24
  • Hola,el campo que pudiesen compartir en común es el documento de identidad el cual esta definido en las todas las tablas, el problema es que en las tablas SA , CA Y BR dicho campo puede ser null o no.

    Mi idea general era que el query buscase si el nombre del usuario que yo le paso existe en la tabla SA, CA Y BR y si existe que busque en cual de esas 3 tablas tiene el documento de identidad definido para luego buscar dicho documento de identidad en la tabla Empleado

    martes, 6 de junio de 2017 12:54
  • Entonces no basta con combinar las filas de las tablas SA, CA y BR. Te propongo lo siguiente:

    SELECT
        e.docIdentidad, e.nombre, e.apellido,
        MAX(CASE WHEN t.Origen = 'CA' THEN 'SI' ELSE 'NO' END) AS [CA],
        MAX(CASE WHEN t.Origen = 'SA' THEN 'SI' ELSE 'NO' END) AS [SA],
        MAX(CASE WHEN t.Origen = 'BR' THEN 'SI' ELSE 'NO' END) AS [BR]
    FROM
        Empleados e
        INNER JOIN
        (
    	   SELECT t1.nombreusuario, MAX(t1.docIdentidad) OVER() AS [docIdentidad], t1.Origen
    	   FROM (
    		  SELECT nombreusuario, docIdentidad, 'CA' [Origen] FROM CA.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario
    		  UNION ALL
    		  SELECT nombreusuario, docIdentidad, 'SA' [Origen] FROM SA.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario
    		  UNION ALL
    		  SELECT nombreusuario, docIdentidad, 'BR' [Origen] FROM BR.TablaEmpleados
    				    WHERE nombreusuario = @nombreusuario) t1
        ) t ON e.docIdentidad = t.docIdentidad
    GROUP BY
        e.docIdentidad, e.nombre, e.apellido;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Wolfteam20 miércoles, 7 de junio de 2017 1:58
    martes, 6 de junio de 2017 17:33
  • muchas gracias, era justo lo que necesitaba ;D
    miércoles, 7 de junio de 2017 1:59