Van egy SQL problémám:
Van két tábla. Az egyk neve legyen A, a másik B. ''A'' tábla tartalma: KVOD, TKOD, DATUM, MENNY, stb. ''B'' tartalma: VKOD, TKOD. A mezőnevek egyezősége nem véletlen.
A feladat: Töröljük ki ''A'' táblából azokat a sorokat, amelyek benne vannak a ''B'' táblában! (természetesen VKOD és TKOD is meg kell, hogy egyezzen)
Vajon hogy néz ki az SQL parancs?
[Szerkesztve]
SQL kérdések - Szoftverfejlesztés fórum
hozzászólások
Imrege
(csendes tag)
Snypie
(csendes tag)
DELETE FROM A
WHERE A.VKOD = B.VKOD
AND A.TKOD = B.TKOD
Imrege
(csendes tag)
Igen, az ACCESS ennél a megoldásnál kérte a B.VKOD illetve a B.TKOD értékét paraméterként. Merthogy ugyebár a B tábla nincs felsorolva...
Tersius
(tag)
Halkan mondom, mert lehet, hogy hulyeseg (bar igy tanitottak nekem, azt hiszem):
DELETE FROM A
WHERE A.VKOD = B.VKOD
AND A.TKOD = B.TKOD
A B.VKOD helyett egy alselectet csinalj.
..
WHERE VKOD=(SELECT VKOD FROM B)
..
Ez csak egy tipp, en igy probalnam megcsinalni (oracle 9i alatt, ha ez szamit)
Alan
(aktív tag)
DELETE FROM A
WHERE VKOD =
(SELECT VKOD FROM B
WHERE B.VKOD = A.VKOD
AND B.TKOD = A.TKOD)
lao ce
(aktív tag)
vaaagy oracle-ben legalabbis menne ha kiprobalnam:
delete from A
where (VKOD, TKOD) in (select VKOD, TKOD from B)
(szerk: azt hiszem)
[Szerkesztve]
chop
(őstag)
bizony-bizony, buta accessnek alselect kell..mysqlben nem..access(officeban) 100 rongy korul van, mysql ingyenes..kesz
(mielott vki lehurrogna: tudom, az access mezei felhasznaloknak keszult, de konyorgom, mi a szarnak kellett jet sqlt bele rakni, miert nem volt jo a szabvany...? ejnye-ejnye, billy boy..)
RAM
(őstag)
Sziasztok!
Segítséget szeretnék kérni egy primitív (egy soros megoldásokkal) feladatsor megoldásához.
(Esetleg kérdedznék még programozásból lámer kérdéseket...)
Ki lenne ily kedves segítőkész?
[Szerkesztve]
Tersius
(tag)
En irtam neked imelt, hogy egy probat tehetunk, hatha sikerul, de nem valaszoltal.
[Szerkesztve]
RAM
(őstag)
Nem tudom mi van, vmi gáz van ezzel az emaillel!
Akkor elküldöm neked miről lenne szó egy másik e-mailcímről!
RAM
(őstag)
Levél most ment! (feladatbenne (levélben, csatolt doc-ban is))
sequator
(senior tag)
SOS kellene help, remélem tud valaki segíteni.
win2ksp4+sql2ksp3 éppen query analyserben írtam egy selectet, és elment az áram, de a querym nem volt elmentve, honnan lehet esetleg előbányászi a query tartalmát?
azt remélem, hogy valahol csak magvan valami tmp fájlban vagy hasonlóban, nagyon kellen, mert egész napi melómat újra kellen kezdenem
Sautia
sequator
(senior tag)
második up, ha valaki tud segítsen, mert még QA-t sem merek indítani, nehogy felülírja az esetleg létező untitled.sql-t
Sautia
Robiba
(tag)
Szerintem memóriában tárolja, nincs semmi tmp
Nem tudom milyen select, de ha egy napig tart, biztos rossz. (bocsi)
sequator
(senior tag)
nem egy select és nem egy napig fut, hanem a nap folyamán írtam 10-15 selectet különböző lekérdezéskhez és azok kellettek volna.
azért kösz, szerncsére az 5 legfontosabbat sikerült egész hamar újra megírni
Sautia
OddMan
(őstag)
Egy kicsit off...
Tanultam a relációs adatbázisokról. Megtanultam a normálformákat és ismerem az egyed-kapcsolat modellt is. A kapcsolatokról is tanultam és azok ábrázolásáról az egyed-kapcsolat modellben. A kérdésem, hogy hogyan kezdjek el megtervezni egy egyszerűbb adatbázist? Szal egyed-kapcsolat modell segítségével el akarok jutni a 3nf-ig és a kapcsolatokat is ábrázolni akarom.
Egy olyan logikai tervig szeretnék eljutni, amiből már könnyedén lehet bevinni a dolgokat egy relációs adatbáziskezelőbe.
[Szerkesztve]
L3zl13
(nagyúr)
Ceruzával és papírral...
Szvsz megnézed milyen adatokat kell tárolni, ezeket szépen felírod magadnak, aztán normalizálod az adatbázist.
OddMan
(őstag)
Igen papíron akarom megtervezni.
Tehát akkor először az egyedeket kell összeszednem és utána azoknak a tulajdonságait kell megadnom igaz? Ez után kell a normalizálást elkezdeni és aztán a kapcsolatokat jelölni?
[Szerkesztve]
L3zl13
(nagyúr)
Szvsz a kapcsolatok már a normalizálásból adódnak jórészt... Tehát ez párhuzamosan kéne, hogy történjen.
OddMan
(őstag)
Nem tudsz egy doksit a neten, ahol egy végtelenül egyszerű példán végig lehetne kísérni a folyamatot?
L3zl13
(nagyúr)
Háááát, ha tanultál róluk, akkor ott kellett volna találkoznod példával szerintem. Sajnos nem tudok ilyen doksit, de a gugli talán segíthet.
rollingrock
(csendes tag)
Én sahosem értettem igazán ezeket a normálformás alakokat ezért mindig ''ösztönösen'' úgy készítettem el az adatbázis felépítést ahogy szerintem jó. Aztán kiderült néha hogy így teljesen mégsem jó...
Huh tudna valaki segíteni az alábbiakban?
Mi az indexelés?
Mire valók a kulcsok?
Hogy lehet két táblát ''összemergelni''?
mik a DDL, DML, DCL?
Ja és pár relációt is mondajtok már
sürgős!!!
[Szerkesztve]
VladimirR
(nagyúr)
angolul jo? mert akkor index-rol itt talaltam egy leirast => Bővebben: link
Aaalbi
(tag)
Szia
Ezek benne vannak a legtöbb adb-kezelés könyvben.
[Szerkesztve]
azt tudom, de az nekem pont vidéken - Jászalsószentgyörgyön - van én meg pesten vagyok.
Szal otthon van oracle könyvem...
Nedudgi
(aktív tag)
Indexelés: Alapvetően könnyebbé teszi a keresést mert egy mező szerint sorbarendezi a rekordok azonosítóit (kb).
Kulcsok: azonosítják a rekordokat. Összekapcsolják a táblákat egy táblába idegen kulcs, egy másikban (a kapcsolt táblában elsődleges)
Mergelés, utána kéne néznem mert még nem csináltam.
DDL: Data Definition Language
DML: Data Manipulation Language (SQL az 2in 1)
Most látom hogy már egy napos a hozzászólásod, ha kell még segítség vegyél fe ICQ-ra. Segítek szívesen.
Relációk PL:
ADOSOK(azonosito, nev,.....)
KEZESEK(kezes_azon, nev, ados_azonosito....)
KEZESEK.ados_azonosito (idegen kulcs) -> ADOSOK.azonosito (elsodleges kulcs)
Remélem érthető lett
guest666
(aktív tag)
Szevasztok, egy SQL lekérdezésre lenne szükségem:
A CIKK tábla tartalma CIKKSZAM, CIKKNEV, CIKKCSOPORT, EGYSEGAR. Feladat: Cikkcsoportonként melyik termék a legolcsóbb ?
Köszi.
select min(EGYSEGAR), CIKKCSOPORT from CIKK group by CIKKCSOPORT
Valahogy így.
guest666
(aktív tag)
Köszi, eddig oké, csak ez sajnos a legalacsonyabb árakat írja ki a feladat pedig hogy a legolcsób terméket írja ki, tehát a legalacsonyabb árhoz CIKKNEV-et, de MS Accesben sehogy tudom kiíratni...
Ja, akkor valahogy így próbálkozz:
select CIKK.CIKKNEV, MINARAK.AR from
(select min(EGYSEGAR) as AR, CIKKCSOPORT
from CIKK group by CIKKCSOPORT)
as MINARAK
join CIKK on MINARAK.AR = CIKK.EGYSEGAR
Access-el nem igazán lehet ilyesmit összekattintgatni, vagy nagyon nehézkes lenne.
Már 3x kellett átszerkesztenem, hogy rendesen látszódjon...
[Szerkesztve]
sky77
(aktív tag)
Szerintem az is fontos lenne, hogy abból a cikkcsoportból selectálja ki a legalacsonyabb árnak megfelelőt, amelyik cikkcsoportnak a legalacsonyabb áráról van szó, pl így:
select CIKK.CIKKNEV, MINARAK.AR from
(select min(EGYSEGAR) as AR, CIKKCSOPORT
from CIKK group by CIKKCSOPORT)
as MINARAK
join CIKK on MINARAK.AR = CIKK.EGYSEGAR
and CIKK.CIKKCSOPORT = MINARAK.CIKKCSOPORT
Igazad van, ezt elfelejtettem. Kár hogy megmondtad, mert így már guest666-nak semmin nem kell gondolkoznia.
jeszi
(tag)
Sziasztok!
(Gyenge vagyok sql-ben)
Van egy lekérdezés egy Access adatbázisban:
SELECT O.ORVOS_ID, O.VEZNEV1, O.KERNEV1_1, O.KERNEV1_2, I.INTEZMENY_NEV, I.IRSZ, I.TELEPULES, I.CIM, OIS.TELEFON1, OIS.TELEFON2, OIS.MELLEK, ORR.MEGYE, ORR.ORSZAGRESZ
FROM ORVOS AS O, INTEZMENY AS I, ORVOS_INT_SW AS OIS, ORVOS_SZAKVIZSGA_SW AS OSS, SZAKVIZSGA AS SZ, TELEPULES AS T, ORSZAGRESZ AS ORR
WHERE O.ORVOS_ID=OIS.ORVOS_ID And OIS.INTEZMENY_ID=I.INTEZMENY_ID And O.ORVOS_ID=OSS.ORVOS_ID And OSS.SZAKVIZSGA_ID=SZ.SZAKVIZSGA_ID And I.TELEPULES=T.TEL_NEV And T.MEGYE=ORR.MEGYE And SZ.SZAKVIZSGA=PSZAKVIZSGA AND O.ACTIVE = 1
AND O.ORVOS_ID NOT IN
(SELECT E.ORVOS_ID FROM EREDMENY E
WHERE E.EREDMENY_TIP_ID IN (11, 12, 13))
ORDER BY ORR.ORSZAGRESZ, ORR.MEGYE, I.TELEPULES, I.CIM;
Ez borzasztó lassú, valahogy optimalizálni szeretném ezt a lekérdezést (vagy az adatbázist).
Tudna valaki segíteni? Az adatbázisról készítettem egy képet (táblák, kapcsolatok), azt el tudom küldeni e-mail-ben.
sky77
(aktív tag)
Ezt így hirtelen kicsit nehéz átlátni... Talán jobb lenne előről kezdeni a lekérdezést, úgy, hogy elmondod, mi a feladat (milyen adatokat szeretnél visszakapni) és ehhez milyen táblák (ill. mezők) állnak rendelkezésre. Biztosan lehetne ezt is optimalizálni, de valahogy nem visz rá a lélek, hogy átbogarásszam.
jeszi
(tag)
Küldhetek egy e-mailt?
Az adatbázisról készített képet szeretném elküldeni...
[Szerkesztve]
sky77
(aktív tag)
Küldtem választ, de ide is leírom, biztos, ami biztos.
Szerintem, ha mondjuk left join-nal egy egyértelmű megfeleltetést tudsz felállítani a táblák között, kisebb adathalmazból fog dolgozni a select, így van rá esély, hogy gyorsabb lesz, ugyanis
select * from a,bvisszaadja az összes olyan elemet, ami mind a-nak, mind b-nek halmaza, úgy, hogy b összes eleméhe rendeli a összes elemét. Így aztán a where feltétel egy adott esetben akár óriási adathalmazból választja ki azokat a sorokat, akik a kitételnek megfelelnek.
Ha pl így oldod meg:
select * from a
left join b on b.x=a.x
tehát már az összekapcsolásban szerepel a ''where feltétel'', eleve kisebb adathalmazt kapsz, amit nem is kell tovább szűkíteni.
Próbáld meg így, hátha segít valamicskét. Addig is nézegetem a kódot, ha időm engedi.
Szerk.: Lehet, hogy célszerű lenne, ha kevesebb adatot hozna a select, így nem kéne annyi táblát összekapcsolni, s a bővebb információk csak akkor kerülnének lekérdezésre, ha a felhasználó úgy kívánja (pl. gombnyomásra). Már ha a feladat engedi, persze.
[Szerkesztve]
sky77
(aktív tag)
Így gyorsabb? Lefut egyáltalán? Én sajna nem tudom kipróbálni.
SELECT O.ORVOS_ID, O.VEZNEV1, O.KERNEV1_1, O.KERNEV1_2,
I.INTEZMENY_NEV, I.IRSZ, I.TELEPULES, I.CIM,
OIS.TELEFON1, OIS.TELEFON2, OIS.MELLEK,
ORR.MEGYE, ORR.ORSZAGRESZ
FROM ORVOS AS O
left join orvos_int_sw as ois on ois.orvos_id=o.orvos_id
left join intezmeny as i on i.intezmeny_id=ois.intezmeny_id
left join telepules as t on t.tel_nev=i.telepules
left join orszagresz as orr on orr.megye=t.megye
left join orvos_szakvizsga_sw as oss on oss.orvos_id=o.orvos_id
left join szakvizsga as sz on sz.szakvizsga_id=oss.szakvizsga_id
WHERE SZ.SZAKVIZSGA=PSZAKVIZSGA and O.ACTIVE = 1
AND O.ORVOS_ID NOT IN
(SELECT ORVOS_ID FROM EREDMENY
WHERE EREDMENY_TIP_ID IN (11, 12, 13))
ORDER BY ORR.ORSZAGRESZ, ORR.MEGYE, I.TELEPULES, I.CIM;
Talán egy-két táblát is össze lehetne vonni, első ránézésre nem teljesen tűnt indokoltnak, hogy külön táblában vannak adatok, persze lehet hogy tévedek.
Pl.:
orvos_szakvizsga_sw --> orvos
orszagresz --> telepules
[Szerkesztve]
[Szerkesztve]
jeszi
(tag)
Köszönöm, mindjárt kipróbálom!
Bocs, hogy csak most írok, de közben akadt egy-két feladatom
jeszi
(tag)
Az egész orvos adatbázist átraktam Access-ből MySql-be. Az átkonvertálást DBTools Manager Professional programmal végeztem.
Miért van az, hogy ugyan az a lekérdezés Access-ben kb. 5 másodpert, MySql-ben meg 15-20 perc?
sky77
(aktív tag)
Mysql-hez sajna a legkevésbé sem értek, viszont errefelé érdemes lehet körülnézni: Bővebben: link
Ezen belül is talán ez a legmegfelelőbb topic: Bővebben: link
Remélem tudnak segíteni.
sky77
(aktív tag)
Tulajdonképpen pont az inner join-okat szerettem volna kikerülni (select * from a,b is egy inner join), csak ugye az access nem akarta megenni. #44-ben leírt lekérdezést a mysql sem veszi be?