Kezdőoldal » Számítástechnika » Programozás » SQL-ben ezt hogy lehetne...

SQL-ben ezt hogy lehetne egyszerűbb formára hozni?

Figyelt kérdés

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


2014. márc. 3. 22:55
1 2
 1/12 anonim ***** válasza:

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.

2014. márc. 3. 23:07
Hasznos számodra ez a válasz?
 2/12 anonim ***** válasza:

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

2014. márc. 3. 23:11
Hasznos számodra ez a válasz?
 3/12 anonim ***** válasza:
31%

É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%

2014. márc. 5. 19:59
Hasznos számodra ez a válasz?
 4/12 A kérdező kommentje:
neeeeem BME, és még csak nem is programozó szak :( :D
2014. márc. 5. 22:54
 5/12 anonim ***** válasza:

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)

2014. márc. 5. 23:32
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:
A subquery néha nagyon hasznos tud lenni, ha pl. egy descart szorzatot nagyságrendekkel kisebb táblákból kell létrehozni. Persze van, amikor kerülendő. A feladat határozza meg, mikor előnyös és mikor hátrányos.
2014. márc. 6. 10:53
Hasznos számodra ez a válasz?
 7/12 anonim ***** válasza:
...Pláne, ha bizonyos mezők nincsenek indexelve, hiszen azok kezelése is plusz költség.
2014. márc. 6. 10:54
Hasznos számodra ez a válasz?
 8/12 anonim ***** válasza:
Bocs, picit fáradt voltam, amikor írtam. Valóban így nem jó a querym. A MAX() hívásokat vedd le, hiszen azok alapján groupbyolunk, így felesleges. Anélkül már mennie kéne.
2014. márc. 6. 20:51
Hasznos számodra ez a válasz?
 9/12 anonim ***** válasza:

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

2014. márc. 6. 21:39
Hasznos számodra ez a válasz?
 10/12 anonim ***** válasza:

"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.

2014. márc. 6. 22:30
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!