Usunięcie wierszy które nieposiadają danej zawartej w innej tabeli

0

Szukam pomocy odnośnie usunięcia wszystkich wierszy z tabeli gdzie w danej kolumnie znajduję się dane które nie występują w kolumnie innej tabeli.
A szczegółowo to w jednej tabeli "jos_vm_product" znajduje się około 30 kolumn gdzie jedna z nich zatytułowana jest "product_id" , oraz w drugiej tabeli "jos_vm_product_price" również znajduje się pare kolumn gdzie jedna z nich również nazywa się "product_id" .
Chciałbym usunąć wszystkie wiersze w tabeli "jos_vm_prodcut_price" gdzie dane w kolumnie "product_id" nie znajdują swojego odzwierciedlenia w kumnie "product_id" tabeli "jos_vm_product".

Z góry dziękuję za pomoc.
Pozdrawiam
Tomek

0

Mniej-więcej tak:

delete from jos_vm_prodcut_price
where not exists (select 1 from jos_vm_product where jos_vm_product.product_id = jos_vm_prodcut_price.product_id)

Można to też zrobić nieco mniej wydajnie przez not in (podzapytanie).

0

Dużo tez zależy od silnika bazy danych... Ja osobiście na MySQL zrobilbym LEFT JOINem z Nullem...
A używając NOT IN () trzeba bardzo uważać, by tam (w tym podzapytaniu) Null nie wyskoczył...

0

Null to nadal nieistniejąca wartość dla product_id i dla takiej rekord z drugiej tabeli powinien być usunięty (vide dane w kolumnie "product_id" nie znajdują swojego odzwierciedlenia). Bardzo dużo zależy od tego, czy nulle znajdują się w jos_vm_prodcut_price.product_id, ale nie otrzymaliśmy tej informacji.
Co do silnika bazy danych - święta racja, ale skoro pytający nie raczy podać nazwy swojego serwera, to każdy podaje mu odpowiedź w tym, w czym odpowiadającemu wygodnie (u mnie MSSQL) ;-)
A tak z ciekawości - left join jak byś chciał tutaj użyć?

0

Chodzi zapewne o coś takiego:

DELETE FROM jos_vm_prodcut_price
FROM jos_vm_prodcut_price pp
LEFT JOIN jos_vm_product p ON pp.product_id=p.product_id
WHERE p.product_id IS NULL

Ale i tak rozwiązanie @ŁF jest bardziej intuicyjne, plan wykonania prostszy, natomiast wartości NULL też zostaną usunięte.

0

Ech, NULL zawsze jest, był i będzie inaczej traktowany. W szczególności w połączeniu z IN i NOT IN.
Przykład: (1 zapytanie zwraca 0 rekordów, a drugie 2) http://sqlfiddle.com/#!8/9c101/3
Dla ciekawskich można również zamienić tabele (table1 zamiast table2 i vice versal)

0

Zgadzam się, z NULLami trzeba uważać i takim w przypadku należy skorzystać z JOIN, ale jeśli nie występują to wydajnościowo mija się to z celem, wtedy lepszym rozwiązaniem jest użycie NOT EXISTS.
http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/

1 użytkowników online, w tym zalogowanych: 0, gości: 1