SQL-ben ezt hogy lehetne egyszerűbb formára hozni?
A feladat: Listázza ki a dolgozók nevét, munkakörét, és munkakörük átlagfizetését
csak ilyeneket még nem vettünk, mégis számon kérhetik, így kerestem kidolgozott feladatok között, s ezt a megoldást találtam:
select ename as név, emp.job as munkakör, átlfiz
from emp,
(select job, round(avg(sal),0) átlfiz
from emp
group by job) al
where emp.job = al.job;
de ez olyan bonyolult (ez az al, meg al.job, nem értem mik ezek :DD)
1. nem lehet ezt könnyebben megoldani?
2. azért kell az elején emp.job, mert a belső lekérdezésben is használjuk a job-ot, és egy lekérdezésben csak egyszer lehet?
köszi :D
Az "al" a zárójelezett lekérdezés eredményének (tábla) elnevezése. Ott adja meg a zárójel után.
Az al.job pedig az "al" "job" nevű oszlopa.
Igen, azért kell emp.job, mert a FROM részben mindkét táblában (emp és al) van "job" nevű oszlop. Az emp.job-ot teljesen kiírva konkretizálod, hogy te az emp tábla job oszlopát akarod.
employee tábla, mezői name, job, salary
SELECT emp.name, emp.job, sub.avg AS avg
FROM
employer emp
JOIN (SELECT e.job AVG(e.salary) AS avg FROM employee e GROUP BY e.job) sub
ON (emp.job = sub.job)
Kell bele subquery, és join avagy where, másképp nem lehet(egyszerűbben), próbáld meg
Én megpróbáltam, sikerült...
SELECT MAX(emp.name), MAX(emp.job), AVG(emp2.salary) as salary
FROM employee emp join employee emp2 on emp.job=emp2.job
GROUP BY emp.name, emp.job
Gimiben még elmegy a subquery, de ha pl. BME adatbázis laboron megpróbálod beadni a fenti szörnyűséget, akkor lehet, hogy a többi alkalomra már be se kell menned:D (na jó, ez nem igaz, 1 alkalmat lehet pótolni)
jegyezd meg, hogy a subquery-ket amikor lehet kerüljük (még ha a query optimizer át is alakítja neked join-ná)
Összehasonlítottam a te querydet és az én querymet MS-SQL 2012-vel. 1 batchben egymás után a 2 ekvivalens query:
Query 1: Query cost (relative to the batch): 66%
Query 2: Query cost (relative to the batch): 34%
Nemtom, nekem még csak jövőre jön az adatbé labor, de szörnyűségnek inkább a tiédet nevezném.
Szerintem a subqueryt csak akkor kerüljük, ha rekordonként kellene futtatni, mondjuk where-ben. De amit csak egyszer kell, az nagyon hasznos tud lenni.
Hogy én is szolgáljak egy mérési eredménnyel:
Nem voltam rest legenerálni 100000 rekordnyi adatot, az én querym 2 másodperc alatt fut le, a tiéd jelenleg 180 másodpercnél jár, és még mindig fut.
Megmagyarázhatnád, mert ha tévedek, akkor érdekelne, hogy hol hibáztam el a mérést (elég noob vagyok ilyen eskúel téren).
(már 300 másodperc)
Szerintem nem érted. Annak a francos self-joinnak a costja a gond, mivel csinál egy keresztszorzatot.
+ nem jó name-re groupolni, mert a dolgozónként kell kilistázni, nem nevenként
jobra groupolni végképp nem kell, egyáltalán nem ezt kéri a feladat
konkrétan ezzel azt akartam kérdezni, hogy van-e valami, amit nem kéne átírni abban a queryben, és mitől jött ki az MS SQL-nek jobbra, mint amit én írtam
"nem jó name-re groupolni, mert a dolgozónként kell kilistázni, nem nevenként "
Oké, ebben egyetértek, nyilván van egy EmployeeID is a táblában, bár ennek nyomát nem láttam az eddigi bejegyzésekben, ezért hagytam ki. Természetesen azt is hozzá kell venni, ekkor az azonos nevűekkel sem lesz gond.
+nálam van egy index a job és name párra.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!