2012-10-01 17 views
25

No estoy muy familiarizado con Oracle Sql Queries, por lo tanto, tengo un problema al eliminar algunas filas de una tabla que debe cumplir una restricción que incluye campos de otra tabla (unión). En otras palabras, quiero escribir una consulta para eliminar filas, incluido JOIN.Eliminar con "Unir" en Oracle sql Query

En mi caso tengo una tabla ProductFilters y otra tabla Products unida en los campos ProductFilters.productID = Products.ID. Quiero eliminar las filas de ProductFilters teniendo un ID mayor o igual a 200 y el producto al que se refieren tiene el nombre 'Marcar' (el nombre es un campo en el Producto).

Me gustaría ser informado inicialmente si JOIN es aceptable en una consulta de eliminación en Oracle. Si no cómo debería modificar esta consulta con el fin de hacer que funcione, ya que en ese formulario recibo un error:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
);  
+0

¿Cuál es el error que está obteniendo? – davek

+0

sí, puede eliminar utilizando una combinación: vea aquí http://stackoverflow.com/a/3675205/110933 – davek

Respuesta

21

Sobre la base de la respuesta que hay enlaces en mi comentario anterior, esto debería funcionar:

delete from 
(
select pf.* From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 

o

delete from PRODUCTFILTERS where rowid in 
(
select pf.rowid From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select PRODUCTFILTERS.rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 
+0

He intentado con el segundo y recibo el error: "Columna ambiguamente definida". Además, creo que la sintaxis correcta al principio es eliminar PRODUCTFILTERS donde ... Un "De" es superfluo en una consulta de eliminación. – arjacsoh

+0

bien, he agregado un calificador a la referencia de rowid anidada. – davek

+1

Ok, esta vez funciona – arjacsoh

48

Hace poco me enteré de la siguiente sintaxis:

DELETE (SELECT * 
     FROM productfilters pf 
     INNER JOIN product pr 
      ON pf.productid = pr.id 
     WHERE pf.id >= 200 
      AND pr.NAME = 'MARK') 

Creo que se ve mucho más limpio que otros códigos propuestos.

+0

Muy limpio. Usando esto en el futuro para que otros tengan un tiempo más fácil de entender qué es exactamente lo que se está eliminando. – user2025696

+0

Este es ** mucho ** más rápido que las alternativas que pasaron principalmente por una condición where en lugar de una unión. –

+0

Solo quería agregar que, si el JOIN es con una colección (tabla de algo), se produce un error porque no se puede ejecutar DML en una colección PL/SQL. Buena sintaxis, sin embargo. – Alfabravo