2012-10-01 14 views
25

Nie jestem dogłębnie zaznajomiony z kwerendami Oracle SQL, dlatego mam problem z usunięciem niektórych wierszy z tabeli, która musi spełniać ograniczenie, które obejmuje pola innej (dołączanie) tabeli. Innymi słowy chcę napisać zapytanie, aby usunąć wiersze, w tym JOIN.Usuń za pomocą "Dołącz" w kwerencie Oracle sql

W moim przypadku mam tabelę ProductFilters i inną tabelę Products połączoną na polach ProductFilters.productID = Products.ID. Chcę usunąć wiersze z ProductFilters o wartości wyższej lub równej 200, a produkt, do którego się odnoszą, ma nazwę "Znak" (nazwa to pole w Produkcie).

Chciałbym być informowany na początku, jeśli JOIN jest akceptowalny w kwerendzie usuwania w Oracle. Jeśli nie, jak należy modyfikować tego zapytania, aby uczynić go pracy, ponieważ w tej postaci otrzymuję błąd:

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

Jaki jest błąd, który otrzymujesz? – davek

+0

tak, można usunąć przy użyciu sprzężenia: zobacz tutaj http://stackoverflow.com/a/3675205/110933 – davek

Odpowiedz

21

Na podstawie odpowiedzi I połączone w moim komentarzu powyżej, to powinno działać:

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

lub

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

Próbowałem drugi i otrzymuję błąd: "Kolumna niejednoznacznie zdefiniowane". Poza tym myślę, że poprawna składnia na początku to usuń PRODUCTFILTERS, gdzie ... "Od" jest zbędne w kwerendzie usuwania. – arjacsoh

+0

ok, dodałem kwalifikator do zagnieżdżonego odniesienia do wiersza. – davek

+1

OK, tym razem działa – arjacsoh

48

Niedawno dowiedziałem się o następującej składni:

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

Myślę, że wygląda o wiele czystsze niż inne proponowane kod.

+0

Bardzo czysto. Korzystając z tego, aby inni mogli łatwiej zrozumieć, co dokładnie jest usuwane. – user2025696

+0

Ten jest ** znacznie ** szybszy niż alternatywy, które przeważnie przechodziły przez pewien warunek, a nie przez dołączenie. –

+0

Po prostu chciałem dodać, że jeśli JOIN jest z kolekcją (tabela czegoś), pojawia się błąd, ponieważ nie można uruchomić DML w kolekcji PL/SQL. Ale dobra składnia. – Alfabravo