Temat: relecja many-to-many
nie demonizowałbym tabelki orders_products. Jak dołączysz w podzapytaniu klauzulę DISTINCT po ID otrzymasz max. tyle samo rekordów co w tablicy products.
Moim zdaniem jeżeli na tych tablicach są indeksy to optymalizator powinien je wykorzystać ale trzebaby zapuścić Explain Plan.
Miałem podobne rozwiązanie na dużej ilości rekordów i nie sprawiało kłopotów.
Inna metoda to zapytanie po indeksach:
select p.id, p.name, o.product_id
from products p, orders_products o
where (+)p.id=o.product_id
a potem prosty SELECT po wyniku gdzie o.product_id jest NULL
(generalnie podobne rozwiazanie jak Twoje tylko bez funkcji exists)
Krzysztof P.:
Wojciech Nowak:
najprościej chyba tak, tylko pamiętaj aby klucze były indeksowane:
select name from products
where id not in ( select product_id from orders_products)
Najprosciej dla programisty ...
Tylko, że baza musi pobrać wszystkie wiersze z orders_products czyli robisz już w tym momencie full scan prawdopodobnie dość duzej tabeli. Natomiast wersja z EXISTS przerzuca full scan na tabelę z produktami, a zamówienia mogą już byc przeglądane po indeksie. No w ogóle NOT IN bardzo cięzko zmusić do korzystania z indeksu.
Wojciech Nowak edytował(a) ten post dnia 10.09.08 o godzinie 15:03