![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 16.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Posiadam prostą bazę danych szkoły, w której znajdują się tabele: students, teachers, courses i tsc (w której znajdują się informacje o tym jaki student miał jaki przedmiot, jak długo i z którym wykładowcą oraz ocena z tego przedmiotu). Na tej bazie próbuję np. zrealizować zapytanie wyboru roku studiów, na którym jest najwyższa średnia. Robię to w taki sposób:
Co działa, ale nie w przypadku, gdy kilka lat ma tę samą średnią i trzeba wyświetlić wszystkie. Zapytanie poniższe nie działa (pracuje pod SQL Serverem):
Istnieje jakiś prosty sposób realizowania tego typy zapytań, gdzie muszę użyć kilka razy funkcji agregujących razem z grupowaniem, bez korzystania z tabel tymczasowych? Ogólnie mam kilka tego typu zapytań (np. wybór najwyższej średniej, największej liczby przedmiotów ze wszystkich lat, przedmiotu, na który uczęszczało najmniej osób itp.). Chciałbym wiedzieć, jak najoptymalniej realizować tego typu zapytania. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Niestety musisz powielić podrzędne zapytanie wyliczające średnią także w podzapytaniu obliczającym MAX i liczyć, że optymalizator sobie to wykryje:
Chodzi o to, że o ile podzapytania mogą być skorelowane z nadrzędnymi, to już muszą mieć całkowicie własne definicje tabelek. Ponieważ średnią wyliczasz w locie, musisz powielić całe liczące ją zapytanie. Jeśli napisałbyś samo
Wartość MAX byłaby policzona dla każdego wiersza osobno i ogólnie nie działałoby to tak, jak trzeba. Aktualnie nie mam SQL Servera pod ręką, więc napisałem w innym dialekcie, ale myślę, że dasz radę sobie przerobić ![]() -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 1.05.2025 - 05:28 |