none
Consulta multitabla con union

    Pregunta

  • Buenas.

    Estoy con un problema con una consulta. tengo que listar las personas que estan en una tabla y eventualmente las que no estan y mostrarlas de acuerdo a una semana (todas las semanas deben subir archivos a la bd). por ende tengo que distiguir que diga persona subio y persona no subio archivo. pero lo que me pasa es que se me repiten los valores porque estoy utilizando union para la realizacion de la consulta, ¿como puedo dicriminar entre la consulta de un select y otro select al unirlos con el union? para que los valores no se repitan.

    viernes, 15 de abril de 2011 21:01

Respuestas

  • Hola.

    ¿Resolviste el problema? En caso negativo, lo que yo he creído interpretar es que obtienes las personas que están con una consulta y las que no están con otra, relacionadas mediante una select de unión y luego no sabes cómo distinguir qué registros provienen de cada una de las dos consultas. Si es ese, te sugiero el siguiente mecanismo (está simplificado con fines pedagígicos, se puede afinar bastante):

    Select SubioFichero = 'SI', Usuario
    from Tabla1 
    where ....--Filtro que diga los usuarios que sí subieron ficheros
    union
    Select SubioFichero = 'NO', Usuario
    from Tabla2
    where ... --Filtro que diga los usuarios que no subieron ficheros
     and Usuario not in (
    --Aquí pones la primera consulta
    select Usuario
    from Tabla1 
    where ....--Filtro que diga los usuarios que sí subieron ficheros
    )
    

    De esta manera, los usuarios están identificados (sabes de qué select provienen) y, sin llegar a entrar en que la segunda de las consultas debe tener algún tipo de error, quitas los usuarios que aparecieron en la primera de las consultas.

    Intenténtalo y déjanos saber qué tal de fue.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 22 de abril de 2011 15:26
    Moderador

Todas las respuestas

  • En cada Select tendrás que definir sus propias condiciones dentro del WHERE

    Por ejemplo:

    select campoX, campoA from tabla where camposcondiciones = A
    union
    select campoX, campoA from tabla where camposcondiciones = B

    Si las condiciones de las dos Select (Where), definen registros distintos, no tendrás duplicados en el resultado.

    Si nos pasas datos mas concretos, como el diseño de la tabla, y nos detallas que resultado quieres obtener, intentaremos orientarte ajustándonos mas ...


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    viernes, 15 de abril de 2011 21:25
  • Hola Victor Molina,

     

    Aqui tienes todo lo que necesitas del UNION

    http://technet.microsoft.com/es-es/library/ms180026.aspx

     

    Espero que te ayude!

     

    Saludos


    Eduardo Portescheller - LATAM Forum Support Engineer
    Microsoft Corporation
    lunes, 18 de abril de 2011 14:32
    Propietario
  • Hola Victor

    de todas formas, ccreo que tu problema no es el union, sino que no no hemos captado tu problema realmente.

    ¿puede ser que quieras subir todos aquellos registros que aún no han subido? ¿tienes una primary key que los distinga? Si es así, es "fácil". Lo que tienes que hacer no es usar union, sino combinar con left join tus tablas algo así

    insert into tutablaexistente

    Select tutablaimportada.* from tutablaexistente right join tutablaimportada on tutablaexistente.clave=tutablaimportada.clave where tutablaexistente.clave is null

    Espero que se entienda.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    lunes, 18 de abril de 2011 15:49
    Moderador
  • Hola.

    ¿Resolviste el problema? En caso negativo, lo que yo he creído interpretar es que obtienes las personas que están con una consulta y las que no están con otra, relacionadas mediante una select de unión y luego no sabes cómo distinguir qué registros provienen de cada una de las dos consultas. Si es ese, te sugiero el siguiente mecanismo (está simplificado con fines pedagígicos, se puede afinar bastante):

    Select SubioFichero = 'SI', Usuario
    from Tabla1 
    where ....--Filtro que diga los usuarios que sí subieron ficheros
    union
    Select SubioFichero = 'NO', Usuario
    from Tabla2
    where ... --Filtro que diga los usuarios que no subieron ficheros
     and Usuario not in (
    --Aquí pones la primera consulta
    select Usuario
    from Tabla1 
    where ....--Filtro que diga los usuarios que sí subieron ficheros
    )
    

    De esta manera, los usuarios están identificados (sabes de qué select provienen) y, sin llegar a entrar en que la segunda de las consultas debe tener algún tipo de error, quitas los usuarios que aparecieron en la primera de las consultas.

    Intenténtalo y déjanos saber qué tal de fue.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 22 de abril de 2011 15:26
    Moderador