none
Consultas con 2 tablas dif RRS feed

  • Pregunta

  • Buenas a todos, el problema que tengo es que tengo 2 tablas, una(tabla B) contiene nº ref(numero de tarjeta) y control, la otra(Tabla A) contiene toda la información de la persona + nº ref y necesito listar de la tabla A todos aquellos registros que el nº de ref(numero de tarjeta) estén en la tabla B y el control tenga de valor el carácter 's'

    SELECT A.n_ref,A.Nombre
    FROM A,B
    WHERE A.n_ref=B.n_ref AND B.control='s'
    Aclarar que en la tabla A puede el nºref  estar duplicado y existir varios registros con el mismo nºref

    daviel

    martes, 28 de febrero de 2012 10:48

Respuestas

  • Hola DAniel, la respuesta que te ha dado fran es adecuada, lo unico que puede hacer que salgan más registros es que al haber duplicados en B obtengas esos duplicados podrías cambiar la sintaxis de estas formas.

    SELECT DISTINCT A.n_ref,A.Nombre
    FROM TablaA A
    INNER JOIN TablaB B ON A.n_ref=B.n_ref 
    WHERE B.control='s' 
    o bien
    SELECT A.n_ref, A.nombre 
    FROM TablaA A
    where n_Ref in (
    select n_ref from TablaB B where b.control='s')


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Daviel SA miércoles, 29 de febrero de 2012 10:43
    martes, 28 de febrero de 2012 15:56
    Moderador

Todas las respuestas

  • O yo lo estoy entendiendo mal, o la query que has puesto es correcta, solo falta poner en FROM el nombre de las dos tablas. También si te resulta mas fácil de leer puedes usar un JOIN:

    SELECT A.n_ref,A.Nombre
    FROM TablaA A
    INNER JOIN TablaB B ON A.n_ref=B.n_ref 
    WHERE B.control='s' 


    Fran Lens http://es.linkedin.com/in/franlens
    My Blog: http://www.lensql.net

    Please remember click the Mark as Answer button if a post helps you to solve the problem



    • Editado Fran Lens martes, 28 de febrero de 2012 12:16
    martes, 28 de febrero de 2012 12:04
  • Si te fijas en mi code de ejemplo puedes ver que llamo a la tabla1 A y la tabla2 B

    Correcto, usar inner join, pero me teniendo en cuenta que una tabla puede tener más registros que otra(A=4578 y B=20579 registros),  cuando hago el innner join me carga más de 54000 registros. y no hace filtrado alguno con las condiciones On A.n_ref=B.n_ref y el WHERE.

    Simplemente quiero que el contenido de la tabla B si cumple una concición(control='s') pues listar todo el contenido de la tabla A que tenga ese nº de ref. La consulta de la tabla B puede retornar más de un valor(10578 registros para ser más exacto).

    Creo que me he liado un poco explicando el problema que tengo, así que si no queda claro podrían hacermelo saber? gracias


    daviel


    • Editado Daviel SA martes, 28 de febrero de 2012 14:17
    martes, 28 de febrero de 2012 14:16
  • eso es un simple inner join. en tu ejemplo lo pusiste casi bien pero te falto referenciar las tablas are un ejemplo simple
    select a.compra,b.nombreComprador
    from ordenesdecompra a , comprador b
    where a.nombreComprado = b.nombreComprador 
    
    
    
    ------
    
    
    SELECT     a.compra, b.nombreComprador
    FROM         ordenesdecompra AS a CROSS JOIN
                          comprador AS b
    WHERE     (a.nombreComprado = b.nombreComprador)

    aqui te lista todos los registros, osea el nombre del comprador seguido por la compra que hizo.. si no te sale deja los campos de las tablas y o una foto de las tablas con los datos que quieres juntar

    Soy rudo (H)

    martes, 28 de febrero de 2012 15:20
  • Hola DAniel, la respuesta que te ha dado fran es adecuada, lo unico que puede hacer que salgan más registros es que al haber duplicados en B obtengas esos duplicados podrías cambiar la sintaxis de estas formas.

    SELECT DISTINCT A.n_ref,A.Nombre
    FROM TablaA A
    INNER JOIN TablaB B ON A.n_ref=B.n_ref 
    WHERE B.control='s' 
    o bien
    SELECT A.n_ref, A.nombre 
    FROM TablaA A
    where n_Ref in (
    select n_ref from TablaB B where b.control='s')


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Daviel SA miércoles, 29 de febrero de 2012 10:43
    martes, 28 de febrero de 2012 15:56
    Moderador
  • En los ejemplos que puse el nombre de las tablas son A y B, no son alias(cuando digo alias me refiero a FROM nombre_tabla AS A).  por lo que el nombre está correcto, y no tendría que referenciar el nombre.

    Es correcto lo que indica Miguel Egea Gómez, que al haber más registros duplicados en la tabla B con el inner join me mostraría más de los correctos.(por cada registro que coincida con la condición esté o no duplicado, por lo que si existen 15 coincidencias y están duplicadas en una tabla 2 veces, me mostraría 30registros en vez de 15.)

    Lo que no sabía es que la clausula IN se pudiese ejecutar con consultas anidadas, creo que es la respuesta más simple y más efectiva.

    Gracias a los 3 por ayudarme.


    daviel

    miércoles, 29 de febrero de 2012 10:43