Nie rozumiem kodu

0

Mam tabele:
wykonawca (idwykonawcy, nazwa)
album ( idalbumu,nazwa,rok, idwykonawcy)
recenzja(idrecenzji,gazeta,ocena,idalbumu)

wypisz dla wszystkich wykonawcow z jednym albumem ich nazwe i dane albumu (nazwa, rok)

SELECT MAX(wykonawca.nazwa) wykonawca, MAX(album.nazwa) album, MAX(album.rok) rok
FROM wykonawca, album WHERE wykonawca.idwykonawcy = album.idwykonawcy
GROUP BY wykonawca.idwykonawcy HAVING COUNT(idalbumu) = 1;

Nie rozumiem dlaczego tu została uzyta funkcja MAX. Proszę o wyjaśnienie

1

Dziwny ten kod na maxa. I IMHO funkcja MAX nic tutaj nie daje (ale jeśli używasz dla jakiegoś pola agregacji COUNT(idalbumu) to inne pola musiał byś wrzucić w "group by"). A tak ktoś użył tego Max (co nic nie daje bo jest tylko 1 rekord) jako funkcji agregującej.

0

Czyli po prostu funkcja Max została uzyta po to aby nie wrzucac do group by innych pol ?

0

MAX zostało ewidentnie źle użyte.
Załóżmy, że masz dwa rekrody w albumach:
nazwa, rok
ABC, 2000
ZZTop, 1900

MAX(nazwa), MAX(rok) da ZZTop, 2000

0

dokładnie jak pisze Marcin - ten kod na pewno nie zwróci tego czego pytacz oczekuje

0

kod jest dobry bo dostałem go od prowadzącego grupy i gdy go kompiluje zostaje zwrocony poprawny wynik i to mnie dziwi rownież, mozliwe ze to jakas starsza metoda zapisu ktorej nie potrafie zrozumiec

2

Tak jak napisałem w komentarzu. Zapytanie przez przypadek zwraca to, co powinno. A przypadek ten zwie się "z jednym albumem". Z JEDNYM.
Jeśli jest tylko jeden album (wybrane takie rekordy są przez HAVING Count(idalbumu)=1), to wtedy niezależnie czy wieźmiesz Min(), Max(), czy Avg(), to dostaniesz tę właśnie wartość. Ale jeśli ktoś was tego uczy (a widać, że nie wytłumaczył czemu tak się dzieje), to powinien zrobić to po "SQL-owemu"
Czyli np. tak

SELECT w.nazwa wykonawca, a.nazwa album, a.rok
FROM wykonawca w JOIN album a ON w.idwykonawcy=a.idwykonawcy
WHERE w.idwykonawcy IN (
SELECT idwykonawcy FROM album a GROUP BY idwykonawcy HAVING COUNT(idalbumu) = 1
)

No i wykładowca powinien używać JOINów oraz Aliasów :)

EDIT: Teraz za "1" w podzapytaniu możesz wstawić dowolną liczbę i zapytanie zadziała i zwróci prawidłowe wyniki.

1

Toć przecie od początku o tym mówię :)

Tylko z roboty już wychodziłem i nie było czasu przepisać kodu poprawnie jak to Marcin zrobił powyżej .... :D

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