Wydobycie odpowiednich danych na podstawie tabeli

Wydobycie odpowiednich danych na podstawie tabeli
K8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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?:

Kopiuj
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:

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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ść.

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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" ?

K8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Poprawione:

Kopiuj
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))))
BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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.

  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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))))

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.