2012-10-01 10 views
25

Ich bin nicht vertraut mit Oracle Sql-Abfragen, daher habe ich ein Problem beim Löschen einiger Zeilen aus einer Tabelle, die eine Einschränkung, die Felder einer anderen Tabelle (Joining) enthält erfüllen müssen. Mit anderen Worten möchte ich eine Abfrage schreiben, um Zeilen einschließlich JOIN zu löschen.Löschen mit "Join" in Oracle SQL-Abfrage

In meinem Fall habe ich eine Tabelle ProductFilters und eine andere Tabelle Products verbunden Felder ProductFilters.productID = Products.ID. Ich möchte die Zeilen von ProductFilters mit einem ID höher oder gleich 200 löschen und das Produkt, das sie verweisen, hat den Namen "Mark" (Name ist ein Feld in Produkt).

Ich möchte zunächst informiert werden, wenn JOIN in einer Delete Query in Oracle akzeptabel ist. Wenn nicht, wie soll ich diese Abfrage ändern, um damit es funktioniert, da auf dem Formular I einen Fehler erhalten:

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

Was ist der Fehler, den Sie bekommen? – davek

+0

ja, Sie können löschen mit einem Join: siehe hier http://StackOverflow.com/A/3675205/110933 – davek

Antwort

21

Basierend auf der Antwort, die ich oben in meinem Kommentar verknüpft, dies sollte funktionieren:

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' 
) 
); 

oder

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

Ich habe versucht, die zweite und ich erhalte den Fehler: "Spalte zweideutig definiert". Außerdem denke ich, dass die korrekte Syntax am Anfang löschen PRODUCTFILTERS wo ... Ein "From" ist überflüssig in einer Lösch-Abfrage. – arjacsoh

+0

ok, ich habe der verschachtelten rowid-Referenz ein Qualifikationsmerkmal hinzugefügt. – davek

+1

Ok, diesmal funktioniert es – arjacsoh

48

Vor kurzem habe ich gelernt, von der folgenden Syntax:

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

Ich denke, es sieht viel sauberer als andere vorgeschlagene Code.

+0

Sehr sauber in der Tat. Mit dieser Vorgehensweise können andere leichter erkennen, was genau gelöscht wird. – user2025696

+0

Dieser ist ** viel ** schneller als die Alternativen, die meistens durch eine Bedingung und nicht durch eine Verbindung gegangen sind. –

+0

wollte nur hinzufügen, dass, wenn der JOIN mit einer Sammlung (Tabelle von etwas) ist, ein Fehler auftritt, weil keine DML auf einer PL/SQL-Sammlung ausgeführt werden kann. Nette Syntax, obwohl. – Alfabravo