Hogyan kell kiválasztani egy táblából azokat a sorokat, amik nincsenek benne egy másik táblában?
"For ciklussal szépen megvizsgálod minden egyes rekordra az egyezoseget"
Rossz válasz.
Egyrészt ehhez két for ciklus kell, ami a táblák méretéből adódóan nagyon lassú lehet, másrészt ez tipikusan adatbázisra bízható feladat, mert az ilyen dolgokra agyon van optimalizálva és sokkal gyorsabban elvégzi.
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
vagy
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Nem tudom, hogy php-hoz van-e olyan orm, ami deferred evaluation-t alkalmaz (biztos van), de C#-ban így csinálnám Entity Framework-kel:
var result = db.Table1.Where(entity => !db.Table2.Contains(entity)).ToList();
Ezt nem futtatja le egy az egyben az adatokon memóriában, hanem generál belőle egy sql query-t, amit majd a .ToList() híváskor küld le a db-hez.
#2
A két megoldásodban szerintem pont fel van cserélve a két tábla.
De nem ezért írok, hanem mert az első egy nagyon lassú, kerülendő megoldás. Nagy tábláknál iszonyú sok idő lehet.
Ahol lehet, érdemes a
select name from table1
except
select name from table2
alakot használni, ami nagyságrenddel gyorsabb is lehet az előzőnél.
#5
Nem ismerem ezt a módszert, amit írsz. Lehet, hogy ránézésre egyszerűbb. De ha csak annyit tudsz, hogy "generál egy lekérdezést", akkor azért érdemes megnézni, milyet, már ha nem bébi táblákkal dolgozol, és számít a sebesség. Én használtam más olyan programokat, amik lekérdezéseket generálnak, sőt fejlesztettem is, és azért ezek a lekérdezések nem mindig lesznek a leghatékonyabbak. Örül a programozó, ha egyáltalán működnek minden esetben.
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!