Új hozzászólás Aktív témák
-
Apollo17hu
őstag
Hali!
Van egy táblám (t) két oszloppal (A és B).
Elvileg A és B között 1-1 kapcsolatnak kellene lennie. Ha valamely A érték ismétlődik, akkor a sorában a B is ismétlődik.
Kérdés: hogyan tudom kikeresni az eltérő B értékeket?pl.: A - B
xxx - 11
xxy - 18
xxz - 202
yyx - 22
yyx - 22
zzz - 89
zzz - 81
zzx - 12Tehát itt az A oszlopbeli "zzz" értékek mellett kétféle B oszlopbeli érték tartozik, pedig ugyanannak kéne lenniük. Az ilyen - hibás - értékeket szeretném lekérdezni. Hogyan tegyem?
-
Apollo17hu
őstag
válasz eziskamu #542 üzenetére
Akkor ez úgy működik, hogy a DISTINCT segítségével az A és B oszlopokból kulcsot képezünk, aminek a sorait az eredeti tábla soraival hasonlítjuk össze?
És ha lenne egy C oszlop, aminek az elemeire egy sima WHERE szűrést kell még alkalmazni, akkor ez a szűrés mehet a teljes lekérdezés végére egy AND operátorral bekapcsolva?
-
Apollo17hu
őstag
válasz eziskamu #547 üzenetére
Neked is köszönöm a segítséget.
Végül a lekérdezés és az allekérdezés WHERE záradékába is beleírtam a feltételt. Ha kihagyom az allekérdezésből, úgy hibásan kidob olyan eltéréseket is, aminek nem kéne szerepelnie. Remélem, jól csináltam. Valahogy így néz ki tehát:
SELECT DISTINCT t.A, t.B, t.C
FROM t, (SELECT t1.A AS A1, t1.B AS B1, t1.C AS C1
FROM t t1
WHERE t1.C IN (1, 2)) t2
WHERE t.A = t2.A1 AND
t.B <> t2.B1 AND
t.C IN (1, 2) -
Apollo17hu
őstag
válasz eziskamu #548 üzenetére
Igazából munkához kell, egy bonyolultabb lekérdezést egyszerűsítettem erre a problémára. Mint írtam, nem vagyok járatos a témában, ehhez hasonló problémával még nem találkoztam. Azért remélem, menet közben belerázódom, és sokat tanulok az ilyen megoldásokból.
Itthonról próbálgattam most MS Access-ben. Munkahelyen PL/SQL-ben dolgozunk.
-
Apollo17hu
őstag
-
Apollo17hu
őstag
válasz eziskamu #553 üzenetére
Igen, regem az már volt régebbről. Az SQL Developert próbálgattam (az is ingyenes), de vmi dll fájlokat hiányol. Most nem állok neki, talán a jövő héten utánakeresek, hogy pontosan mire van szükség a telepítéséhez, de ezeket a programokat mindenképp üzembe fogom helyezni itthon.
-
Apollo17hu
őstag
Sziasztok!
Kicsit eltér a témától, remélem befér a topikba a kérdésem.
Szeretnék PL/SQL Developert használni Win XP-n, otthoni számítógépemen. Elég kezdő vagyok, csak annyit tudok, hogy kellene alá valamilyen adatbázis szerver.
Hogyan tudok a legegyszerűbben "életet lehelni" a Developerbe? Kellene hozzá külön szervert is telepítenem? Mit ajánlotok?
-
Apollo17hu
őstag
Szia!
Ahhoz mit szólsz, ha fogod a "Comments" táblára megírt lekérdezésed (url és count(*) mezőkkel), amit az "url" mezőn keresztül összekötsz az "Entries" táblából készített lekérdezéssel (ami csak az "url" és a "created" mezőket tartalmazza", majd tolsz az egészre egy DISTINCT-et?
Valahogy így:
SELECT DISTINCT
comments_allekerdezes.url
,comments_allekerdezes.db
,entries_allekerdezes.created
FROM
(SELECT url
,COUNT(*) as db
FROM comments
GROUP BY url) comments_allekerdezes
,(SELECT url
,created
FROM entries) entries_allekerdezes
WHERE comments_allekerdezes.url = entries_allekerdezes.url
ORDER BY entries_allekerdezes.created[ Szerkesztve ]
-
Apollo17hu
őstag
-
Apollo17hu
őstag
Sziasztok!
Egyetemen az ingyenes SQL Developert használtuk adatbázis-kezeléshez. Szeretnék itthon is kisebb adatbázisokat létrehozni, a Developer segítségével pedig SQL-kódok formájában lekérdezéseket írni.
Mi szükséges ahhoz, hogy a PC-men mindezt meg tudjam valósítani (ingyen)? Van-e esetleg egyszerűbb/kezelhetőbb megoldás az otthoni adatbázis-kezelésre?
A hangsúly az SQL-lekérdezéseken van, nem kedvelem az Access-szerű varázslást...
-
Apollo17hu
őstag
válasz martonx #1376 üzenetére
Nincs meg az elméletem hozzá, csak lekérdezéseket írogattunk, arról szinte semmit nem tudok, hogy mi a teendő a MySQL szerver telepítésekor, és hogy mire kell figyelni, milyen kapcsolatokat kell beállítani telepítéskor stb. Erről is szükségem lenne egy emészthető leírásra, ha akad.
-
Apollo17hu
őstag
válasz csabyka666 #1440 üzenetére
főiskolai beadandó? hajrá!
-
Apollo17hu
őstag
válasz Inv1sus #1490 üzenetére
A discounts táblában fel kéne venned mégegy mezőt, ami a kedvezmény típusát jelölné (százalékos, konkrét érték stb.), így a discounts.discount értékét nem kellene figyelned. A CASE WHEN utasításban pedig a kedvezmény típusát jelölő mező értékét vizsgálnád. (Ez alapján lenne szorzás/osztás vagy összeadás/kivonás vagy egyéb művelet.)
-
Apollo17hu
őstag
Sziasztok!
Erre a régi meg új szintaktikára tudnátok egy-egy nagyon rövid példát írni? Miben jobb az új és miért? Van előnye a régi használatának? Köszi!
-
Apollo17hu
őstag
Munkahelyemen mi is így írjuk a kötéseket. Ha jól tudom, azért van így, mert annak, aki nulláról kezdi az SQL-t, egyszerűbb a (+) operátor használatát megérteni (=könnyebben beletanul), mint a többféle JOIN-t, és könnyebb is olvasni a többszáz-/többezersoros kódokat. Nekem ráállt erre az agyam, és nagyságrenddel rövidebb idő alatt értelmezek egy ilyen kódot, mint ami JOIN-okkal van tele.
-
Apollo17hu
őstag
Ilyet én is szoktam csinálni. Az a feladat, hogy megadott feltételek szerint válogassam ki a szükséges néhánytízezer rekordot egy segédtáblába, amivel később a hónap folyamán dolgozunk. A rekordokat könnyű kiválasztani, de kb. 100 attribútum tartozik hozzájuk, azokat pedig 20-25 adattáblából kell összeszedni. Ha ezeket mind egyetlen lekérdezésbe írnám, az életben nem futna le. (Optimalizáláshoz nem értek, az IT-segítség pedig sok lóvéba kerül. ) Ezért a leválogatott rekordokhoz később, UPDATE-ekkel keresem ki az attribútumokat - akár egyesével az eddig fel nem használt adattáblákból.
-
Apollo17hu
őstag
válasz Speeedfire #1804 üzenetére
Úgy akarod, hogy a lekérdezésed eredménye az legyen, hogy:
minden fórumazonosító (id) egyszer, ezekhez pedig a legutolsó (=legfrissebb) komment (comment), és a hozzá tartozó create_time érték? Ha igen, akkor kell bele a comment mező is vagy elég csak az időpecsét? -
Apollo17hu
őstag
válasz Speeedfire #1811 üzenetére
vagy:
SELECT id
,MIN(CASE
WHEN lang = 'hu' THEN
mess
END) AS "hu"
,MIN(CASE
WHEN lang = 'en' THEN
mess
END) AS "en"
FROM tabla
GROUP BY id -
Apollo17hu
őstag
válasz Speeedfire #1818 üzenetére
Igen, ugyanazt az eredményt hozza a kettő, de azért írtam be, mert a pivotot talán nehezebb "testreszabni" nagyobb mátrixoknál.
-
Apollo17hu
őstag
válasz Speeedfire #1880 üzenetére
Az nem lenne jó, ha előbb a 2. táblából csinálnál egyetlen konkatenált oszlopot (+ mellé az id oszlopot), majd az így kapott lekérdezést kötnéd (allekérdezésként) az 1. táblához?
SELECT ...
FROM tabla1
JOIN (SELECT tabla2.id, [konkatenált oszlopok]
FROM tabla2)
ON tabla1.id = tabla2.id[ Szerkesztve ]
-
Apollo17hu
őstag
válasz Speeedfire #1882 üzenetére
Ja, most már értem. Akkor én passzolom a témát.
Botlottam már hasonló problémába korábban, akkor úgy szerettem volna az értékeket összefűzni egy mezőbe, hogy az ismétlődések csak egyszer jelenjenek meg benne. Lényegében te is ezt csinálnád a nullértékekkel/nullákkal. Na, erre nincs normális függvény [prog.hu -n legalábbis nem tudtak segíteni, és gugli is csak olyan találatokat adott, ahol ciklusokat kell használni (PL/SQL)].Esetleg ha úgy csinálnád, hogy:
SELECT
CASE WHEN a.int1 IS NOT NULL THEN a.int1 || ', ' END ||
CASE WHEN a.int2 IS NOT NULL THEN a.int2 || ', ' END ||
CASE WHEN a.int3 IS NOT NULL THEN a.int3 || ', ' END ||
CASE WHEN a.int4 IS NOT NULL THEN a.int4 || ', ' END ||
CASE WHEN a.int5 IS NOT NULL THEN a.int5 || ', ' END ||
a.int6
FROM (...) a[ Szerkesztve ]
-
Apollo17hu
őstag
válasz Speeedfire #1884 üzenetére
Jövő héten ki fogom próbálni, pont az volt a gáz, hogy a listagg() függvény nem engedte a DISTINCT-et.
-
Apollo17hu
őstag
válasz dellfanboy #1911 üzenetére
Nekem is volt szerencsém mindkettőhöz.
Az SQL Developer-t egyetemen fél évig használtuk. Arra jó volt, hogy fogalmat kapjunk a relációs adatbázisokról, a többfelhasználós környezetről, és alap SQL utasításokat is írtunk. Sajnos nem tudom, ennél mennyivel tudhat többet a program, de azt külön hangsúlyozta a szemináriumvezetőnk, hogy azért az SQL Developerre esett a tanszék választása, mert teljesen ingyenes.
Munkám során pedig PL/SQL Developert használok, és bár a "PL" funkcionalitást szinte egyáltalán nem használom ki, sokkal profibbnak tűnik, bővebb funkcionalitással (pl. automatikus kódkiegészítések). (Ez lehet, hogy azért is van, mert 3 év alatt volt időm megismerkedni vele.) Ő ugye fizetős...
-
Apollo17hu
őstag
Nekem egyetemen a 2.-at (JOIN-ok) oktatták, munkahelyen az 1.-t használjuk. Szerintem aki teljesen kezdő SQL-ben, annak könnyebben rááll az agya az 1. verzióra, mert ott az egyenlőségjelen kívül (+) jelöli a gyenge kötést, míg a 2. verzióban LEFT, RIGHT, OUTER stb. kulcsszavak is használandóak. Az 1. verzió egyetlen hátránya, hogy a FULL OUTER JOIN-t nem lehet szépen megvalósítani (UNION kell hozzá). Ebben az egy esetben használom én is inkább a JOIN-t.
Ja, és fórumtársak írták, hogy nekik a JOIN sokkal átláthatóbb, mert egyből látszik, hogy mi hova kapcsolódik. Ez igaz, de ha tucatnyi tábla van összekapcsolva, akkor talán jobb, ha előbb látszik, hogy egyáltalán milyen táblákat használ a lekérdezés (1. verzióban FROM után a legtöbb tábla felsorolásra kerül). Ha az ember az ideje 90%-ában ugyanazokkal a táblákkal dolgozik, akkor úgyis fejből tudja a kapcsolatokat.
-
Apollo17hu
őstag
válasz csabyka666 #2032 üzenetére
Én úgy csinálnám, hogy a meglévő adatok alapján felvinném az összes felhasználót a felhasználó táblába, az összes terméket pedig a termék táblába (mindenkit és mindegyiket csak egyszer).
Nem tudom, hogy hívják magát a "feltöltést", de hasonló esetben én a tranzakció kifejezéssel találkoztam. Tehát van egy halom tranzakciód, ami tartalmazza, hogy ki, mit és mikor töltött fel. Ezeket kell a kapcsolótáblába felvinni. (felhasználó egyedi azonosítója + termék egyedi azonosítója + feltöltés dátuma)
Innentől kezdve csak a kapcsolótáblát töltöd. Akkor kell a másik kettőhöz hozzányúlnod, ha új felhasználó vagy új termék jelenik meg egy tranzakcióban. (Ez esetben a felhasználó- és/vagy a terméktáblát kell előbb kiegészíteni.)
[ Szerkesztve ]
-
Apollo17hu
őstag
válasz csabyka666 #2034 üzenetére
Nagyvonalakban ezek az infóid vannak:
felhasználó | felhasználói infók (több mező) | termék | termékinfók (több mező)
Azt írod, hogy nincs két ugyanolyan termék (-> különböző vonalkódok). Ha így van, akkor szerintem felesleges a kapcsolótábla. Az egész mehetne egy táblába. Annyit lehetne normalizálni rajta, hogy a felhasználóknak külön táblát hozol létre, amibe minden felhasználói infót letárolsz, a másik táblában pedig elég csak felhasználóazonosítót használnod.
-
Apollo17hu
őstag
válasz csabyka666 #2124 üzenetére
SELECT * FROM tabla
WHERE UPPER(mezo) LIKE '%ALMA%' -
Apollo17hu
őstag
válasz csabyka666 #2165 üzenetére
A 4 mezőben keresel azt jelenti, hogy a felhasználó max. 4 szót adhat meg szűkítésnek? Szerintem a keresők nem ezen az elven működnek, de ha te így szeretnéd, akkor talán az AND mégis használható lenne, ha REGEXP helyett LIKE '%keresés%' jellegű kifejezéseket vizsgálnál. Amúgy a REGEXP honnan jött? Miben jobb a LIKE-nál a lekérdezésedben?
-
Apollo17hu
őstag
FULL OUTER JOIN-nal azonosítón keresztül összekötök két táblát. A táblákban időbélyegek vannak, mindkettőben adott nap (ugyanaz a nap) érdekel csak. Ha a táblákat allekérdezésbe rakom, és "előszűröm" őket a szükséges napra, akkor működik a lekérdezésem.
Van allekérdezés nélküli megoldás? Ez a kód nem jó, mert a WHERE miatt metszetet kapok unió helyett (-> "megöli a FULL OUTER JOIN-t")
SELECT ...
FROM t1
FULL OUTER JOIN
t2
ON t1.id = t2.id
WHERE 1 = 1
AND t1.calendar_date = to_date('20131231', 'yyyymmdd')
AND t2.calendar_date = to_date('20131231', 'yyyymmdd') -
Apollo17hu
őstag
válasz FireFox1996 #2201 üzenetére
A legegyszerűbb megoldást keresem egy olyan halmaz létrehozására, ami tartalmazza t1 és t2 minden elemét (az azonos elemeket csak egyszer), és segédmezőkben tárolom, hogy az elem megtalálható-e t1-ben és/vagy t2-ben. Utóbbira CASE WHEN t1.id IS NOT NULL THEN 'x' END t1_fl és t2_fl mezőket vettem fel. Nem tudom, hogy UNION ALL -lal a segédmezők megvalósíthatóak-e. (A segédmezőkre később szűrök, ezért kellenek.)