none
Consulta compleja RRS feed

  • Pregunta

  • Hola
    Tengo dos tablas en Access:

    Tabla 1
    id Nombre
    -- ------------
    1 Pedro
    2 Juan
    3 Antonio
    4 Alex

    Tabla 2
    id Grupo
    -- ----------
    1 A
    1 B
    1 C
    2 B
    3 A
    4 B
    4 C

    La Tabla1 tiene los registros de personas, y la Tabla2 los grupos a los que pertenecen dichas pesonas, relacionadas con el campo id. La pregunta es, cómo puedo saber qué personas pertenecen sólo al gupo B y a ningún otro, es decir, una consuta que me devuelva sólo el nombre Juan.

    Un saludo y gracias por todo.
    domingo, 16 de septiembre de 2018 9:33

Respuestas

  • Hola vmp1970:

    CREATE TABLE tabla1
    (id     INT,
     nombre VARCHAR(10)
    );
    CREATE TABLE tabla2
    (id    INT,
     grupo VARCHAR(10)
    );
    GO
    INSERT INTO tabla1
    (id,
     nombrE
    )
    VALUES
    (1,
     'Pedro'
    ),
    (2,
     'Juan'
    ),
    (3,
     'Antonio'
    ),
    (4,
     'Alex'
    );
    INSERT INTO tabla2
    (id,
     Grupo
    )
    VALUES
    (1,
     'A'
    ),
    (1,
     'B'
    ),
    (1,
     'C'
    ),
    (2,
     'B'
    ),
    (3,
     'A'
    ),
    (4,
     'B'
    ),
    (4,
     'C'
    );
    GO
    
    CREATE TABLE tabla1
    (id     INT,
     nombre VARCHAR(10)
    );
    CREATE TABLE tabla2
    (id    INT,
     grupo VARCHAR(10)
    );
    GO
    INSERT INTO tabla1
    (id,
     nombrE
    )
    VALUES
    (1,
     'Pedro'
    ),
    (2,
     'Juan'
    ),
    (3,
     'Antonio'
    ),
    (4,
     'Alex'
    );
    INSERT INTO tabla2
    (id,
     Grupo
    )
    VALUES
    (1,
     'A'
    ),
    (1,
     'B'
    ),
    (1,
     'C'
    ),
    (2,
     'B'
    ),
    (3,
     'A'
    ),
    (4,
     'B'
    ),
    (4,
     'C'
    );
    GO
    SELECT a.nombre
    FROM TABLA1 A
         INNER JOIN Tabla2 b ON a.id = b.id
    WHERE b.grupo = 'B'
          AND NOT A.ID IN
    (
        SELECT ID
        FROM TABLA2
        WHERE GRUPO <> 'B'
    );

    Existen varias posibilidades de realizar lo que solicitas. Una de las más fáciles, de ver, es, relacionar las dos tablas, y pedir solo los que tengan un grupo 'b', y que no tengan, y haces una subconsulta, de todo el resto de grupos.

    Espero te sirva.

    Saludos

    domingo, 16 de septiembre de 2018 19:30
  • Trata:

    -- opcion 1 - agrupar

    select T1.id, T1.Nombre
    from T1 inner join T2 on T1.id = T2.id
    group by T1.id, T1.Nombre
    having min(T2.Grupo) = max(T2.Grupo) and min(T2.Grupo) = 'B';

    -- opcion 2 - EXISTS
    select T1.*
    from T1
    where exists (select * from T2 where T2.grupo = 'B' and T2.id = T2.id)
    and not exists (select * from T2 where T2.grupo <> 'B' and T2.id = T2.id)


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 18 de septiembre de 2018 13:59

Todas las respuestas

  • Hola vmp1970:

    CREATE TABLE tabla1
    (id     INT,
     nombre VARCHAR(10)
    );
    CREATE TABLE tabla2
    (id    INT,
     grupo VARCHAR(10)
    );
    GO
    INSERT INTO tabla1
    (id,
     nombrE
    )
    VALUES
    (1,
     'Pedro'
    ),
    (2,
     'Juan'
    ),
    (3,
     'Antonio'
    ),
    (4,
     'Alex'
    );
    INSERT INTO tabla2
    (id,
     Grupo
    )
    VALUES
    (1,
     'A'
    ),
    (1,
     'B'
    ),
    (1,
     'C'
    ),
    (2,
     'B'
    ),
    (3,
     'A'
    ),
    (4,
     'B'
    ),
    (4,
     'C'
    );
    GO
    
    CREATE TABLE tabla1
    (id     INT,
     nombre VARCHAR(10)
    );
    CREATE TABLE tabla2
    (id    INT,
     grupo VARCHAR(10)
    );
    GO
    INSERT INTO tabla1
    (id,
     nombrE
    )
    VALUES
    (1,
     'Pedro'
    ),
    (2,
     'Juan'
    ),
    (3,
     'Antonio'
    ),
    (4,
     'Alex'
    );
    INSERT INTO tabla2
    (id,
     Grupo
    )
    VALUES
    (1,
     'A'
    ),
    (1,
     'B'
    ),
    (1,
     'C'
    ),
    (2,
     'B'
    ),
    (3,
     'A'
    ),
    (4,
     'B'
    ),
    (4,
     'C'
    );
    GO
    SELECT a.nombre
    FROM TABLA1 A
         INNER JOIN Tabla2 b ON a.id = b.id
    WHERE b.grupo = 'B'
          AND NOT A.ID IN
    (
        SELECT ID
        FROM TABLA2
        WHERE GRUPO <> 'B'
    );

    Existen varias posibilidades de realizar lo que solicitas. Una de las más fáciles, de ver, es, relacionar las dos tablas, y pedir solo los que tengan un grupo 'b', y que no tengan, y haces una subconsulta, de todo el resto de grupos.

    Espero te sirva.

    Saludos

    domingo, 16 de septiembre de 2018 19:30
  • Funciona perfecto.

    Gracias

    domingo, 16 de septiembre de 2018 21:47
  • Trata:

    -- opcion 1 - agrupar

    select T1.id, T1.Nombre
    from T1 inner join T2 on T1.id = T2.id
    group by T1.id, T1.Nombre
    having min(T2.Grupo) = max(T2.Grupo) and min(T2.Grupo) = 'B';

    -- opcion 2 - EXISTS
    select T1.*
    from T1
    where exists (select * from T2 where T2.grupo = 'B' and T2.id = T2.id)
    and not exists (select * from T2 where T2.grupo <> 'B' and T2.id = T2.id)


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 18 de septiembre de 2018 13:59