Temat: Mam problem i szukam pomocy...
Fantastyczny przykład do czego prowadzi brak normalizacji...
Zakładając strukturę choć nieco bardziej znormalizowaną (czyli id, nazwa_sałatki, składnik) gdzie PK (id, składnik) (składnik to pewnie id to słownika składników), tabelę lodówka (składnik) - napisałoby się
select z.nazwa_sałatki
from sałatki z
left outer join lodówka l on z.składnik = l.składnik
group by z.nazwa_sałatki
having sum(case when l.składnik is null then 1 else 0 end) = 0
żeby dostać listę sałatek które możemy przygotować z tego, co mamy w lodówce.
Wracając do problemu...Najlepiej jakbyś przeprojektował bazę. W drugiej kolejności, normalizował w locie. W trzeciej
select z.nazwa_sałatki
from sałatki z
cross join lodówka l
where ',' || z.przepis || ',' like '%,' || l.składnik || ',%'
group by z.nazwa_sałatki
having count(*) = max(length(replace(z.przepis, ',', ''))) + 1
Innymi słowy, produkujesz iloczyn kartezjański z przepisów i składników, po czym bierzesz tylko takie, które są na liście. Do tego wiesz ile powinienneś składników zużyć (ilość przecinków + 1), tak więc wiesz ile w każdym przepisie powinno być użytych składników...
Grzegorz G. edytował(a) ten post dnia 26.08.08 o godzinie 15:55