|
|
Oldal: 1 / 1
|
[ 23 hozzászólás ] |
|
Szerző |
Üzenet |
volgyi_peter
vas-tag
Csatlakozott: pén. jún. 24, 2011 10:46 Hozzászólások: 2
|
Re: SQL kérdés
Tehát ha jól értem, ezek szerint tényleg meg tudom csinálni ugyanazt az ORBER BY-jal, mint az indexeléssel, csak sebességbeli különbség van? Azért kérdezem, mert mondjuk egy könyvelő programban, ahol a számla alapján könyvelés közben az ember kiválaszt egy partnert, nekem jó lenne, ha azt is meg tudnám csinálni, hogy bármelyik oszlopra hirtelen le tudnám rendezni a partnertörzset. Például a számlán nem látszik az eladó bélyegzője tökéletesen, ezért csak töredék információk alapján tudom kikeresni a partnert. Tehát ilyen esetben tök jó lenne, ha esetleg indexelés nélkül is bármelyik oszlopra le tudom rendezni a partnereket ezzel az ORDER BY záradékkal. Tudsz még erre mondani valamit, hogy jól gondolom-e, vagy félreértettem?
|
pén. jún. 24, 2011 11:33 |
|
|
vackor
gyémánt tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 4797 Tartózkodási hely: Siófok
|
Re: SQL kérdés
Az indexelés alapvetően a lekérdezést segíti. Ha egy oszlophoz nincs index, akkor az összes sort végig kell ellenőrizni, melyik felel meg a feltételnek (rendezetlen halmaz). Ha van index, akkor az alapján gyorsabban mehet a szűrés (rendezett halmaz). Megj.: A fórumot nem kell állandóan olvasni, kérhetsz értesítést a témához.
|
pén. jún. 24, 2011 11:19 |
|
|
volgyi_peter
vas-tag
Csatlakozott: pén. jún. 24, 2011 10:46 Hozzászólások: 2
|
Re: SQL kérdés
Sziasztok, kezdő Delphi programozó és kezdő SQL-es vagyok. Azt a kérdést szeretném feltenni, hogy mi értelme van az SQL-ben egy relációhoz indexet készíteni (CREATE INDEX), ha a SELECT parancsban van egy ORDER BY záradék, amivel ugyanazt meg tudom csinálni. Vagy nem??? Minden hozzászólás érdekel, mert mindenből tudok tanulni. Azt kérem, hogy aki válaszol, az jelezze a volgyi_peter@konstruktura.hu email címemre, mert nem tudom ezt a fórumot mindig olvasni. Nagyon köszönöm mindenkinek a segítséget, aki szán egy kis időt egy kezdő okítására. Völgyi Péter, 2011.06.24. volgyi_peter@konstruktura.hu
|
pén. jún. 24, 2011 10:52 |
|
|
Lordring
ezüst tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 60
|
Re: SQL kérdés
Sziasztok! Van egy ilyen egyszerű lekérdezésem: SELECT T0.[ItemCode], T0.[Dscription], T1.[CardCode], T0.[Quantity], T0.[Price], T0.[LineTotal], T0.[TotalFrgn] FROM INV1 T0 INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode WHERE T0.[DocDate] >=[%1] and T0.[DocDate] <= [%2] Azt szeretném megoldani, hogy az eredménylistát csoportosítsa T1.CardCode szerint és az egyes csoportok végén összesítse a T0.Quantity és a T0.LineTotal mennyiségeket. Tudna valaki segíteni?
|
szer. jún. 02, 2010 8:12 |
|
|
NickE
platina tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 754
|
Kösz! Nehezebbet vártam
|
vas. nov. 30, 2008 14:39 |
|
|
kRoy
arany tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 146
|
NickE írta: Azt hogy lehet megcsinálni, hogy van egy pl. 1000 sort tartalmazó táblám de a lekérdezésnél csak 30 sort szeretnék látni, ami kifér egy képernyőn és léptető gombokkal szeretnék tovább menni.
Legyen pl. autok tábla. SELECT * FROM autok LIMIT 30; behúzza az első 30-at, de ha a 31-60 tartományt szeretném látni, akkor hogyan tovább? MySQL-t használok.
SELECT * FROM autok LIMIT X,Y
Ahol X az első rekord Y pedig a rekordok száma.
Azaz
a SELECT * FROM autok LIMIT 0,30 visszaadja az első 30 találatot,
a SELECT * FROM autok LIMIT 30,30 visszaadja a második 30 találatot,
a SELECT * FROM autok LIMIT 60,30 visszaadja a harmadik 30 találatot
Részletes magyarázat és példa:
http://www.tonymarston.net/php-mysql/pagination.html
|
vas. nov. 30, 2008 13:12 |
|
|
NickE
platina tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 754
|
Azt hogy lehet megcsinálni, hogy van egy pl. 1000 sort tartalmazó táblám de a lekérdezésnél csak 30 sort szeretnék látni, ami kifér egy képernyőn és léptető gombokkal szeretnék tovább menni.
Legyen pl. autok tábla.
SELECT * FROM autok LIMIT 30; behúzza az első 30-at, de ha a 31-60 tartományt szeretném látni, akkor hogyan tovább?
MySQL-t használok.
|
vas. nov. 30, 2008 12:23 |
|
|
ChrisPapa
ezüst tag
Csatlakozott: vas. feb. 20, 2005 21:51 Hozzászólások: 69 Tartózkodási hely: Tizenháromker-AngyalfŐd
|
Sparow2 írta: Nem count(*)-ot kell mondani (mint én is rosszul írtam a fenti példában), hanem count(városkód)-ot. A count a null értékeket nem számolja, és 0-t kéne visszaadnia a null-os mezőre. (Legalábbis ORACLE-ban, meg 1-2 másik adatbázisban amit már használtam így működik, de a MySQL-t nem ismerem.)
Hú, de nagyon igaz!
Természetesen MySQl-ben is így van! :]
|
csüt. szept. 18, 2008 11:21 |
|
|
Select
vas-tag
Csatlakozott: szer. szept. 17, 2008 15:44 Hozzászólások: 2
|
Köszönöm a segítséget mindkettőtöknek!
Mivel MS SQL-ről van szó így a Sparow2 megoldása azonnal működött is amit alig akartam elhinni mert én is hasonlóval próbálkoztam, csak jóval komplikáltabban és nem működött jól.
Valahogy így nézett ki:
SELECT Varosnev, (SELECT Count(2tabla.[Serial Number]) FROM 2tabla, 1tabla where (((1tabla.[VarosID])=2tabla.VarosID))) AS Expr1
FROM 1tabla, 2tabla
WHERE ide egy csomó kivétel került
GROUP BY 1tabla.Varosnev;
Na ez nem működött, de a lényeg az, hogy amit írtál az igen.
KÖSZÖNÖM!
|
csüt. szept. 18, 2008 10:17 |
|
|
Sparow2
gyémánt tag
Csatlakozott: hétf. jún. 26, 2006 11:21 Hozzászólások: 2544
|
ChrisPapa írta: A konkrét MySQL verzióval egészíteném ki Sparow2 hozzászólását: Kód: select if( varos.id is null, 0, count(*) ) from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id group by eszkoz.varos_id
Ez is a "left join"-nal operál, a "select"-ben a feltétel azért kell, mert akkor is visszatér egy sorral a count, ha az eszköz táblában nem talált v.mely városhoz. (Ebben az esetben a jobb oldali táblában szereplő mezőket NULL értékkel tölti fel.) Nem count(*)-ot kell mondani (mint én is rosszul írtam a fenti példában), hanem count(városkód)-ot. A count a null értékeket nem számolja, és 0-t kéne visszaadnia a null-os mezőre. (Legalábbis ORACLE-ban, meg 1-2 másik adatbázisban amit már használtam így működik, de a MySQL-t nem ismerem.) Valami ilyesmi akkor: Kód: select tabla1.varosnev, count(tabla2.varoskod) as db from tabla1 left outer join tabla2 on tabla1.varoskod = tabla2.varoskod group by tabla1.varosnev
És tényleg jó ötlet, hogy a count meg a group nélkül nézd meg, rögtön látod mi történt (főképp, ha nagyon kevés sor van és átlátható könnyen)
|
csüt. szept. 18, 2008 10:13 |
|
|
ChrisPapa
ezüst tag
Csatlakozott: vas. feb. 20, 2005 21:51 Hozzászólások: 69 Tartózkodási hely: Tizenháromker-AngyalfŐd
|
A konkrét MySQL verzióval egészíteném ki Sparow2 hozzászólását:
Kód: select if( varos.id is null, 0, count(*) ) from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id group by eszkoz.varos_id
Ez is a "left join"-nal operál, a "select"-ben a feltétel azért kell, mert akkor is visszatér egy sorral a count, ha az eszköz táblában nem talált v.mely városhoz. (Ebben az esetben a jobb oldali táblában szereplő mezőket NULL értékkel tölti fel.) A könnyebb megértés érdekében lefuttathatod először a count és a join nélkül is: Kód: select * from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id
|
csüt. szept. 18, 2008 9:37 |
|
|
Sparow2
gyémánt tag
Csatlakozott: hétf. jún. 26, 2006 11:21 Hozzászólások: 2544
|
1. tábla
Budapest 11
Mezőtúr 12
Bugyi 13
2. tábla
klf1234 13
krth125 13
krtlop14 13
hjloo14 12
Ami nekem kellene a lekérdezés eredménye kép az ez:
Budapest 0
Mezőtúr 1
Bugyi 3
Ha kicsik a táblák, jó így is:
Kód: select városnév, (select count(*) from 2tábla where 2tábla.városkód = 1tábla.városkód) from 1tábla
Ha nagyobbak, akkor outer join-t érdemes csinálni, mert a fenti példában a count(*)-s alselect az eredmény minden rekordjára lefut (ha mondjuk 10 sor jön ki, akkor 10-szer számlálja végig a táblát, ha 1000 rekord jön ki, akkor 1000-szer, a Te példádban csak 3-szor). Outer joinnal csak egyszer megy végig mindkét táblán. Ennek megadása adatbázisonként más lehet. ORACLE-ban pl. ennyi: Kód: select tabla1.varosnev, count(*) as db from tabla1, tabla2 where tabla1.varoskod = tabla2.varoskod (+) group by tabla1.varosnev
/* Esetleg érdemes lehet belevenni a group-ba és a select listába a tabla1.varoskod-ot is, mert igazából az az egyedi, de most a példa szempontjából mindegy. */
A (+) azon az egyenlőségjel azon oldalán van, amelyik tábla sorai helyett töltse a null értékeket. PostgreSQL-ben vagy Sybase-ben, ha jól emlékszem, nem (+) hanem (*) kellett és éppen az ellentétes oldalra. Ha nem tévedek van valami szabványos megoldás is, amit minden relációs adatbáziskezelőnek ismernie kell, valami ilyesmi, de lehet nem pontosan így kell: Kód: select tabla1.varosnev, count(*) as db from tabla1 left outer join tabla2 where tabla1.varoskod = tabla2.varoskod group by tabla1.varosnev
Itt ha jól tudom, a bal oldali tábla minden rekordja szerepelni fog (amikhez nincs meg a párja a jobb oldali táblában).
Van a fordítottja a rigth outer join, amikor értelemszerűen ugyanez, de a jobb oldali táblából szerepel minden rekord. Meg van full outer join (ha így hívják) amikor mindkét táblából az összes rekord kijön.
Persze a legtöbb ember (én is) ezt ritkán használja, mert egyszerűbb odaírni egy (+)-ot, mint azt, hogy "left outer join" (bár talán a "left outer" is elég, azt hiszem).
Na, nem próbáltam ki a pédákat, ha esetleg valamit rosszul írtam le, és nem futna le, azért ezekből már ki tudsz indulni. Neten rá tudsz keresni: outer join.
Remélem segítettem.
|
csüt. szept. 18, 2008 9:05 |
|
|
Select
vas-tag
Csatlakozott: szer. szept. 17, 2008 15:44 Hozzászólások: 2
|
Sziasztok,
Az lenne a problémám, hogy van két táblám:
1. helység melynek van egy száma (ez az azonosító) és egy neve
2. eszköz melynek van egy száma(azon) és többek közt még egy száma mely arra utal, hogy melyik helységben van az eszköz.
Tehát kb ilyen:
1. tábla
Budapest 11
Mezőtúr 12
Bugyi 13
2. tábla
klf1234 13
krth125 13
krtlop14 13
hjloo14 12
Ami nekem kellene a lekérdezés eredménye kép az ez:
Budapest 0
Mezőtúr 1
Bugyi 3
Tehát egy Count kell amivel az gondom, hogy mivel a 2. táblában nem szerepel a Budapest azonosító száma ezért a végeredményben csak a Mezőtúrt és Bugyit kapom.
Hogy a francba csináljam, hogy a fent leírt táblát kapjam?
|
szer. szept. 17, 2008 15:57 |
|
|
Sparow2
gyémánt tag
Csatlakozott: hétf. jún. 26, 2006 11:21 Hozzászólások: 2544
|
Ha jól értlemezem:
A táblában van 3 mező:
azon, azon1, azon2
És azok a sorok kellenének, ahol ugyanahhoz az azon-hoz azon1 és azon2 is többször szerepel.
Sztem:
select azon, azon1, azon2
from tabla
group by azon, azon1, azon2
having count(azon1) > 1 and count(azon2) > 1
Mivel groupolnod is kell, meg szűrnöd is, ezért kell having.
|
kedd nov. 13, 2007 9:54 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
Őszinte leszek én az alapfelállást sem értem. Nem tudnál egy táblát idebigyesszteni pár sorral? Meg azt, hogy mit szeretnél látni!
|
hétf. nov. 12, 2007 17:26 |
|
|
_optikus_
arany tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 474
|
az en kerdesem valami ilyesmi lenne:
adott 1 tabla (valojaban sok de igy egyszerubb elmondani)
van benne 3 mezo. egy csoport azon (ismetlodik) egy azon1 es egy azon2 (valojaban a ket azon tobb tablan keresztul join-olva jon fel).
azokat a sorokat (csoportokat) kellene listazni amelyeknel az azon1 es azon2 is tobbszor fordul elo (de csak azokat). amelyek 1:n vagy n:1 tipusuak azok nem erdekelnek, csak az n:n. eleg a csoport azon, nem baj ha duplikal vagy megjelenik a tobbi mezo is.
mindezt valami primko sql-ben mert tobb fele kezelore kene. most valami havingos countos dolgon kapisgalok de hatha van valakinek jobb otlete
|
hétf. nov. 12, 2007 16:33 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
Szia!
Bár elviekben már késő
De következő kódfrissítésnél lecserélem, mert kúvva jó
Nagyon szépen köszönöm!!!
Üdv,
Zsoca
|
kedd aug. 28, 2007 16:17 |
|
|
Sparow2
gyémánt tag
Csatlakozott: hétf. jún. 26, 2006 11:21 Hozzászólások: 2544
|
Zsoca:
A második megoldásodban annyiszor lefut a két belső al-select ahány sorod van a táblában. Nagy táblánál nagyon lassú lesz.
Esetleg egy ilyet javasolhatnék:
Kód: select a as nev, sum(decode(b, 'igen', 1, 0)) as igen, sum(decode(b, 'nem', 1, 0)) as nem from tabla group by a
Ez egyszer megy csak végig a táblán.
|
kedd aug. 28, 2007 14:01 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
Az ilyen csávókat metyu, ha tehetném legalább fél évre eltiltanám a teljes nettől, de nem tehetem, úgyhogy csak a fórumról fogunk eltiltani
|
pén. aug. 17, 2007 8:38 |
|
|
metyu
vas-tag
Csatlakozott: csüt. aug. 16, 2007 17:16 Hozzászólások: 1
|
|
csüt. aug. 16, 2007 17:17 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
Már van egy még egyszerűbb megoldásom (egyik kollegám besegített ):
Kód: SELECT DISTINCT nev AS "Név", (SELECT COUNT(*) FROM valaszok WHERE valasz='igen' AND nev=t.nev) "Igenek", (SELECT COUNT(*) FROM valaszok WHERE valasz='nem' AND nev=t.nev) "Nemek" FROM valaszok t;
|
kedd aug. 14, 2007 14:23 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
Elvileg van megoldásom, csak túl bonyolultnak tűnik
Kód: SELECT nev AS "Név", DECODE(cnt1,null,0,cnt1) AS "Igenek", DECODE(cnt2,null,0,cnt2) AS "Nemek" FROM (SELECT nev, COUNT(nev) cnt1 FROM valaszok WHERE valasz='igen' GROUP BY nev), (SELECT nev, COUNT(nev) cnt2 FROM valaszok WHERE valasz='nem' GROUP BY nev) WHERE n1(+) = n2
UNION
SELECT nev AS "Név", DECODE(cnt1,null,0,cnt1) AS "Igenek", DECODE(cnt2,null,0,cnt2) AS "Nemek" FROM (SELECT nev, COUNT(nev) cnt1 FROM valaszok WHERE valasz='igen' GROUP BY nev), (SELECT nev, COUNT(nev) cnt2 FROM valaszok WHERE valasz='nem' GROUP BY nev) WHERE n2(+) = n1;
Valaki tud egyszerűbbet?
|
kedd aug. 14, 2007 9:12 |
|
|
Zsoca-M5
gyémánt tag
Csatlakozott: pén. márc. 26, 2004 9:12 Hozzászólások: 2711 Tartózkodási hely: Budapest, Érd
|
SQL kérdés
Sziasztok!
Már tök hülyének érzem magam, mert marha egyszerűnek tűnik, de 45 perce ezzekl szívok és ennyit már nem ér
Szóval adott egy tábla legyen mondjuk 2 oszlopa A és B.
B értéke két értéket vehet fel, pl. igen-nem.
Legyen pl a tartalom ez:
A, B
Zsoca, igen
Zsoca, igen
Zsoca, nem
Nekem egy olyan SELECT kéne, ami ezt adja vissza:
A, x, y
Zsoca, 2, 1
Ahol x az igenek száma, y a nemek száma (egy sorban).
Előre is kösz ha valaki csípőből idevágja
Üdv,
Zsoca
|
hétf. aug. 13, 2007 13:38 |
|
|
|
Oldal: 1 / 1
|
[ 23 hozzászólás ] |
|
Ki van itt |
Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 5 vendég |
|
Nem nyithatsz témákat ebben a fórumban. Nem válaszolhatsz egy témára ebben a fórumban. Nem szerkesztheted a hozzászólásaidat ebben a fórumban. Nem törölheted a hozzászólásaidat ebben a fórumban.
|
|
|