none
Eliminar registros que no están en cierta tabla RRS feed

  • Pregunta

  • Hola buen día. Estoy haciendo una consulta para eliminar registros que no se están utilizando, pero tengo mis dudas espero me puedn apoyar:

    Tengo la table PRODUCTOS y la tabla MOVIMIENTOS. Los PRODUCTOS que se han utilizado por lo menos una vez están en la tabla MOVIMIENTOS, por lo que un producto pueden estar más de una vez en la tabla MOVIMIENTOS. Requiero eliminar aquellos productos que no se han utilizado(NO ESTÁN EN LA TABLA MOVIMIENTOS) pero quiero hacerlos de forma masiva. Mi consulta que he preparado es la siguiente. Dicha consulta la he incluido en un DELETE para que elimine los registros pero me marca error:

    SELECT *
      FROM PRODUCTOS p
     WHERE NOT EXISTS (SELECT NULL
                         FROM MOVIMIENTOS m
                        WHERE m.cidproducto = p.cidproducto)

    La consulta anterior me envía los productos que no tienen movimientos. Si existe una mejor manera o si es incorrecta para que de favor me apoyen y se los agradeceré mucho.

    Esa consulta la intento incluir en un DELETE para que se eliminen esos códigos pero me marca error:

    delete from admproductos pr where exists
    (SELECT *
      FROM admproductos p
     WHERE NOT EXISTS (SELECT NULL
                         FROM admmovimientos m
                        WHERE m.cidproducto = p.cidproducto))

    Me marca error en el primer WHERE. Gracias por su apoyo. Saludos cordiales

    martes, 2 de julio de 2019 4:01

Todas las respuestas

  • Hola JorgeRuizC:

    Tu escenario:

    CREATE TABLE productos
    (cidproducto INT, 
     des         VARCHAR(10)
    );
    GO
    CREATE TABLE movimientos
    (idmov       INT IDENTITY(1, 1), 
     cidproducto INT
    );
    GO
    INSERT INTO Productos
    (cidproducto,  des)
    VALUES
    (1,  'a'),
    (2,  'b'),
    (3,  'c'),
    (4,  'd'),
    (5,  'e'),
    (6,  'f');
    GO
    INSERT INTO movimientos(cidproducto)
    VALUES(1), (1), (1), (2), (1), (4), (6), (4), (6);
    GO

    6 productos, pero el 3 y el 5 no tienen movimientos.

    Para encontrarlos, utilizó left join donde la parte derecha del conjunto sea igual a null

    DELETE FROM productos
    WHERE cidproducto IN
    (
        SELECT p.cidproducto
        FROM productos p
             LEFT JOIN movimientos m ON p.cidproducto = m.cidproducto
        WHERE m.cidproducto IS NULL
    );

    Salida

    • Propuesto como respuesta Carlos_Ruiz_M martes, 2 de julio de 2019 15:21
    martes, 2 de julio de 2019 4:41
  • Hola Javi; me funcionó a la perfección. Muchas gracias. Saludos
    miércoles, 3 de julio de 2019 19:18
  • De nada.

    Un saludo para ti tb.

    miércoles, 3 de julio de 2019 20:50