Wydobycie odpowiednich danych na podstawie tabeli

0

Mam następującą treść:

Podać nazwę lasu i nazwę gatunku zwierząt, które najcześciej odwiedzają dany las, pod warunkiem ze las ten nie zajmuje największej powierzchni (w porównaniu do innych lasów) w żadnym województwie, na terenie którego leży.

Czy te rozwiązanie jest poprawne?:

SELECT gz.nazwa, l.nazwa
FROM gatunek_zwierze gz INNER JOIN Zwierze z
ON gz.id_gatunku = z.id_gatunku
INNER JOIN zwierze_las
ON z.id_zwierzecia = zl.id_zwierzecia
GROUP BY gz.id_gatunku, l.id_lasu
HAVING count(id_zwierzecia) = (SELECT MAX(cout(id_zwierzecia))
                               FROM zwierze_las zl2
                               WHERE zl.id_zwierzecia = zl2.id_zwierzecia AND
                                     zl2.id_lasu = (SELECT id_lasu
                                                    FROM las l
                                                    WHERE l.id_lasu = (SELECT id_lasu
                                                                       FROM Las_wojewodztwo lw
                                                                       WHERE lw.powierzchnia  < ANY
 (SELECT id_lasu
FROM Las_wojewodztwo lw2
WHERE lw2.id_wojewodztwo = lw.id_wojewodztwo))))

Schemat bazy:

0

Weź to zapytanie sformatuj jakoś z sensem i powstawiaj wszędzie aliasy oraz popraw literówki.

Jak masz dużo zapytań skorelowanych, to polecam skorzystać z klauzuli WITH, polepszysz czytelność.

0
kaczor8383 napisał(a):

pod warunkiem ze las ten nie zajmuje największej powierzchni (w porównaniu do innych lasów) w żadnym województwie, na terenie którego leży.

Jaką rolę pełni tutaj słówko "żadnym" ?

0

Poprawione:

SELECT gz.nazwa, l.nazwa
FROM gatunek_zwierze gz INNER JOIN Zwierze z
ON gz.id_gatunku = z.id_gatunku
INNER JOIN zwierze_las zl
ON z.id_zwierzecia = zl.id_zwierzecia
GROUP BY gz.id_gatunku, l.id_lasu
HAVING COUNT(id_zwierzecia) = (SELECT MAX(count(id_zwierzecia))
                               FROM zwierze_las zl2
                               WHERE zl.id_zwierzecia = zl2.id_zwierzecia AND
                                     zl2.id_lasu = (SELECT id_lasu
                                                    FROM las l
                                                    WHERE l.id_lasu = (SELECT id_lasu
                                                                       FROM Las_wojewodztwo lw
                                                                       WHERE lw.powierzchnia  < ANY
 (SELECT id_lasu
FROM Las_wojewodztwo lw2
WHERE lw2.id_wojewodztwo = lw.id_wojewodztwo))))
0

Takie drzewo zapytań skorelowanych bardzo ciężko się czyta. Tak na szybko widzę na przykład, że w ostatnim podzapytaniu porównujesz powierzchnie z id lasu.

Spróbuj wyjąć zapytania skorelowane poza zapytanie główne używając klauzuli WITH, to ułatwi czytanie całości. Dodaj do każdego jakąś sensowną nazwę gdzie np.

  1. NAJWIEKSZE_LASY - Zwracające id największych lasów w poszczególnych województwach.
  2. ZWIERZE_LAS_ODWIEDZENIA - Zwracające id lasu, id zwierzęcia i liczbę odwiedzin, pod warunkiem, że id lasu nie występuje w NAJWIEKSZE_LASY.
  3. Zapytanie główne bazujące na ZWIERZE_LAS_ODWIEDZENIA, przefiltrowane po największej liczbie odwiedzin dla danego lasu. Potem tylko podłączyć się do słowników.

W takiej postaci dużo łatwiej będzie to przeanalizować i ewentualnie wprowadzić zmiany.

0
SELECT gz.nazwa, l.nazwa
FROM gatunek_zwierze gz INNER JOIN Zwierze z
ON gz.id_gatunku = z.id_gatunku
INNER JOIN zwierze_las zl
ON z.id_zwierzecia = zl.id_zwierzecia
GROUP BY gz.id_gatunku, l.id_lasu
HAVING COUNT(id_zwierzecia) = (SELECT MAX(COUNT(id_zwierzecia))
                               FROM zwierze_las zl2
                               WHERE zl.id_zwierzecia = zl2.id_zwierzecia AND
                                     zl2.id_lasu = (SELECT id_lasu
                                                    FROM las l
                                                    WHERE l.id_lasu = (SELECT id_lasu
                                                                       FROM Las_wojewodztwo lw
                                                                       WHERE lw.powierzchnia  < ANY
 (SELECT powierzchnia
FROM Las_wojewodztwo lw2
WHERE lw2.id_wojewodztwo = lw.id_wojewodztwo))))

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