- Megjelent a Red Magic kompakt OLED kijelzős gaming táblagépe
- Nvidia GPU-k jövője - amit tudni vélünk
- ThinkPad (NEM IdeaPad)
- Hobby elektronika
- Milyen házat vegyek?
- Milyen notebookot vegyek?
- Vezetékes FEJhallgatók
- Kezdő fotósok digitális fényképei
- HiFi műszaki szemmel - sztereó hangrendszerek
- AMD K6-III, és minden ami RETRO - Oldschool tuning
Új hozzászólás Aktív témák
-
-
lm83
őstag
Sziasztok.
Karakter kódolással kapcsolatban lenne kérdésem.
Hogy kellene állítani a táblákat, hogy amikor keresek, akkor külön kezelje az ékezetes karaktereket?
Most utf8mb_unicode_ci van állítva, de próbálkoztam itt magyarral is.
Keresek Nev-re és kidobja a Név-t is.
phpMyAdmin-ban dolgozom.Igazából php-ben csinálnám a lekérdezést, csak itt kérdeztem volna először, mert maga az adatbázisban is már így írja ki ez eredményeket.
Vagy programozásban tudnám ezt szűrni? -
nyunyu
félisten
Elég a kettő:
select t1.id, t1.szin, t2.id, t2.szin
from tabla1 t1
left join tabla2 t2
on t2.id = t1.id
and t2.szin = t1.szin
union
select t1.id, t1.szin, t2.id, t2.szin
from tabla1 t1
right join tabla2 t2
on t2.id = t1.id
and t2.szin = t1.szin;Sima union kiszűri az ismétlődéseket az eredménylistából. (union all megtartaná a közös találatok mindkét példányát.)
-
nyunyu
félisten
Erre való a full (outer) join:
select t1.id, t1.szin, t2.id, t2.szin
from tabla1 t1
full join tabla2 t2
on t2.id = t1.id
and t2.szin = t1.szin; -
pch
senior tag
Az alábbi lekérdezést meg lehet csinálni egy lekérdezésbe vagy három kell?
Van két tábla.
Első táblába azonosító és hivatkozás.
Második tábla azonosító és hivatkozás.
Kellene a két tábla unioja, de úgy, hogy ahol az azonosító és a hivatkozás megegyezik ott az union-ba az egy sor legyen.
példa:
Első:
123;zöld
123;kék
123;sárga
Második:
456;zöld
123;kék
456;lilaKimenet:
123;zöld;-;-;
123;kék;123;kék
123;sárga;-;-;
-;-;456;zöld;
-;-;456;lila;Köszi!
-
nyunyu
félisten
Jut eszembe, oszlop egyenlőség vizsgálatokat lehetett volna egyből a where után pakolni:
select t.*
from tabla t
where t.b = t.a
or t.c = t.a
or t.d = t.a
or t.c = t.b
or t.d = t.b
or t.d = t.c;Talán ez lett volna a legegyszerűbb megoldás.
-
Apollo17hu
őstag
válasz
hellsing71 #5581 üzenetére
igy esetleg?
select t.*
from tabla t
where case
when t.m1 = t.m2 then 1
when t.m1 = t.m3 then 1
when t.m1 = t.m4 then 1
when t.m2 = t.m3 then 1
when t.m2 = t.m4 then 1
when t.m3 = t.m4 then 1
end = 1 -
nyunyu
félisten
válasz
hellsing71 #5581 üzenetére
Önmagával left joinolod a rekordokat hatszor (4*3/2 oszlopkombináció van, lásd kombinatorika), aztán ha van találat, akkor azok duplikáltak.
select distinct t.*
from tabla t
left join tabla t1
on t1.id = t.id
and t1.b = t.a
left join tabla t2
on t2.id = t.id
and t2.c = t.a
left join tabla t3
on t3.id = t.id
and t3.d = t.a
left join tabla t4
on t4.id = t.id
and t4.c = t.b
left join tabla t5
on t5.id = t.id
and t5.d = t.b
left join tabla t6
on t6.id = t.id
and t6.d = t.c
where t1.id is not null
or t2.id is not null
or t3.id is not null
or t4.id is not null
or t5.id is not null
or t6.id is not null;Persze ehhez az is kell, hogy minden rekordnak legyen egyedi azonosítója (példámban id mező), hogy ne két random rekord oszlopait hasonlítsd össze.
-
hellsing71
tag
Üdv, segítség kéne. Minden (MariaDB) rekordban van (mások mellett) négy 1B-os mező. Kellene egy lekérdezés, ami listázza azokat, amelyekben egy érték legalább 2× megjelenik, pl.
0;0;128;192
0;0;0;0,
24;0;24;18.
Ismétlődés bármely pozícióban lehet.Ez nekem új, bármilyen útmutató jól jönne.
-
szazbolha
addikt
Üdv, lehet a kérdésem nem teljesen idevaló, de hátha tudtok segíteni.
MS SQL 2019 expresst telepítettem egy kis fogyasztású gépre, amin Win10 pro van
Alig használjuk, ezért alvási idő 1 órára van állítva.
A gép elalszik de az első SQL csatlakozás vagy lekérdezés felébreszti, minden ok.
Újra elalszik és 10-ből 8x nem ébred újra ugyanazon lekérdezéstől.
Mi lehet az oka? Hogy lehet beállítani, hogy mindig felébredjen? -
nyunyu
félisten
válasz
Petya25 #5569 üzenetére
Jó helyre raktad a zárójeleket?
Meg ahogy rákerestem T-SQL specifikus példákra, feltűnt, hogy mind a PIVOT előtti alquerynek, mind az azutáninak szoktak aliast adni.
Nem tudom, ez mennyire kötelező ott. (Oracle alatt opcionálisak)SELECT * FROM
(
SELECT datum, hely, ertek
FROM tabla
) x
PIVOT
(
SUM(ertek)
FOR datum IN (SELECT DISTINCT datum FROM tabla WHERE datum >= TRUNC(SYSDATE) - 7 ORDER by datum)
) p
ORDER BY hely; -
Petya25
őstag
Már rájöttem a dologra.
Az ékezetet nem kezeli, megzavarta...Ez lett a megoldás:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.datum)
FROM tabla c order by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')set @query = 'SELECT hely, ' + @cols + ' from
(
select datum, ertek, hely from tabla
) x
pivot
(
max(ertek)
for datum in (' + @cols + ')
) p 'execute (@query)
-
-
nyunyu
félisten
válasz
Petya25 #5567 üzenetére
SELECT * FROM
(
SELECT datum, hely, ertek
FROM tabla
)
PIVOT
(
SUM(ertek)
FOR datum IN ('2022-08-15', '2022-08-16', '2022-08-17')
)
ORDER BY hely;Kb. 5 percbe tellett testreszabni az első szembejövő PIVOT példát. (PIVOT szintaxis jóideje szabványos, mindegy melyik DB tutorialját nézed)
Bár lehet, hogy a dátumok kézzel felsorolása helyett elegánsabb lenne alselectet írni:
FOR datum IN (SELECT DISTINCT datum FROM tabla ORDER by datum)
-
Petya25
őstag
MS SQL-ben kellene egy kis pivot segítség (Excelben 2 katt…)
Csak adott számú dátum kombináció van (10) nem "végtelen".select dátum, hely, érték from tábla
2022-08-15 BP 21
2022-08-16 BP 25
2022-08-17 BP 23
2022-08-15 VÁC 15
2022-08-16 VÁC 34
2022-08-17 VÁC 2helyett ez kellene:
2022-08-15 2022-08-16 2022-08-17
BP 21 25 23
VÁC 15 34 2 -
nyunyu
félisten
Ahogy nézegetem, nem Oracle környezetekben eléggé kihívás a regexp_substr-nek megfelelő funkcionalitás, általában nincs olyan függvény, ami csak a mintának megfelelő részstringet adja vissza.
Pl. MS SQL Servereken lehet bohóckodni a
substr(information, patindex('%[0-9]{13}%', information), 13)
-mal.Meg a számjegy osztályra hivatkozást szögletes zárójelbe kell csomagolni: [[:digit:]], ehelyett egyszerűbb/rövidebb a 0-9 karaktereket matchelni, ahogy írtátok a [0-9]-cel.
-
nyunyu
félisten
Szerintem a regexp_like és regexp_substr függvényeket keresi, de utána kéne nézni az adott DB motornál mi a pontos szintaxisuk.
Valami ilyesmire gondoltam:
UPDATE cikk
SET ean = regexp_substr(information, '[:digit:]{13}')
WHERE regexp_like(information, '[:digit:]{13}'); -
pch
senior tag
Ez az update nem azt csinálja. Lehet félreérthető voltam.
Szóval az information mezőbe valahol van az ean kód. Ezt akarom átrakni egy ean mezőbe.
Ugye a regxp azt csinálja, hogy megnézi a szövegben azt a részt ahol egymás után 13 szám van. Azaz a bemenő szövegből az ean marad (Jó esetben). Ezt meg az update-nél fel tudom már használni. -
tm5
tag
Erről a PREGEXP-ről még soha nem hallottam SQL SELECTben. Milyen SQL szerverről beszélünk itt? Mert eléggé eltérő módon támogatják a regexp-et, vagy nem.
Valami ilyesmi kellene:
UPDATE cikk
SET information = <az EAN forrása>
WHERE information NOT LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' -
pch
senior tag
Üdv!
regexp -be kellene segítség, de lehet nem is lehet megvalósítani amit akarok...
Szóval van egy tábla (cikk) amibe az információknál (information) van a termékeknek az EAN kódja megadva. Azaz a leírás tartalmazza.
Most szeretném azt megoldani, hogy ahol nem az ean mezőbe van az EAN kód ott egy update-t lefuttatva belerakom.
Egyelőre a lekérdezésnél tartok, de a regexp nem nagyon úgy működik ahogy elképzeltem és a google csak a Where feltételbe hozza példának.
Szóval:SELECT cikk.information PREGEXP '^[0-9]{13}$' FROM cikk WHERE cikk.cikk_id='2';
Nos ez az ami nem ad csak egy 0-t. Egyáltalán lehet ezt így? Vagy hogy kellene hatékonyan kiszűrni az adatokat egy mezőből?
Vagy írjam meg php-ba ciklusba?Köszi!
-
petyus_
senior tag
Sziasztok!
MS SQL Serverben kellene írnom egy olyan lekérdezést, ami több oszlopra csinál free-text szűrést, nem teljes egyezést keresek, hanem csak szó elejit. Kb ezt kellene összehoznom:
SELECT * FROM table
WHERE (col1 LIKE 'str1%' or col1 LIKE 'str2%') or
(col2 LIKE 'str1%' or col2 LIKE 'str2%')A probléma, hogy nem tudom a search-filter hány szóból áll. A CONTAINS jónak tűnne, mert ott meg tudom adni az összes szót OR-ral, de ahhoz full text indexing kellene, és kicsit overkillnek érzem, mivel ezek az oszlopok csak egy nevet tárolnak, tehát nem egy hosszú szöveget. A search-filtert átadhatom egyben is, hogy sql-ben csináljak valamit, vagy akár mehet user defined table type-ként.
Tudtok javasolni valalmi megoldást a CONTAINS-en kívül?
-
nyunyu
félisten
Ja, CTAS nem csak tábla másolásra jó.
Pl. van egy giga lekérdezésed, ami sok táblából lapátol össze adatot, akkor a konkrét végeredményt is el tudod úgy menteni, hogy a SELECT elé írod, hogy
CREATE TABLE <táblanév> AS
Itt persze figyelni kell arra, hogy az eredeti lekérdezésben minden mezőnév egyedi legyen.
Meg arra is figyelni kell, hogy az eredményhalmazban szereplő leghosszabb string alapján határozza meg a számított VARCHAR() mezők hosszát, így ha a létrehozott táblába akarsz később insertálni, akkor nem biztos, hogy bele fog férni ugyanannak a lekérdezésnek az eredménye, ha mondjuk egy oszlopba két stringet fűzöl össze, aztán később hosszabb stringek lesznek a forrás táblákban... -
nyunyu
félisten
CTAS az emlékeim szerint szabványos szintaxis, mennie kéne nem Oracle DBken is.
Ha a SELECT után nem * áll, akkor csak a hivatkozott oszlopok fognak bekerülni az új táblába az eredeti adattípussal.
* esetén minden oszlop másolódik.Viszont arra figyelni kell, hogy a másolat táblán csak a mezők típusai fognak másolódni.
Constraintek (primary key, foreign key..), indexek NEM, azokat neked kell kézzel létrehozni, figyelve arra, hogy ezek nevei nem egyezhetnek az eredeti táblán használt constraintek, indexek neveivel!CTAS végére írt WHERE mögé írt feltétellel tudod megadni, hogy melyik sorokat másolja át az eredeti táblából.
Ha nincs WHERE, akkor mindent másol, de ha pl. WHERE 1=2;-t írsz, akkor csak a táblaszerkezet fog létrejönni, adatok nélkül. -
RedHarlow
aktív tag
Sziasztok,
Egy táblából szeretnék bizonyos adatokat elmenteni egy másik táblába. A tábla minden sora kell így az eredeti táblával megegyező táblastruktúrára lenne szükségem. Ezt hogy a legegyszerűbb megcsinálni? -
nyunyu
félisten
Rendeléseket kérdezted:
Kellene egy lista amibe azon a rendelések vannak amin akad még tennivaló.Amit írtam queryt, az visszaadja mindegyik rendelést, amihez tartozik legalább egy kuldes_id=0 vagy szamla_id =0 tétel.
Ha a konkrét, még nem kész megrendelés tételeik is kellenek, akkor
select t1.rendeles_id, t2.tetel_id
... -
pch
senior tag
Ez nem azt az eredményt adja.
Mégegyszer: A kuldes_id és a szamla_id a tételeknél van. Egy rendeléshez több tétel is kapcsolódik. Ha a tételnél a kuldes_id-be 0 van akkor ugye azzal még kell foglalkozni. De van olyan eset is ahol mondjuk 10 tételnek már van kuldes_id-je ami nem 0 de egynek nincs.
Akkor azzal még van teendő.
-
nyunyu
félisten
Akkor az IS NULL-okat cseréld = 0-ra
SELECT DISTINCT T1.rendeles_id
FROM rendeles AS T1
JOIN tetel AS T2
ON T1.rendeles_id=T2.rendeles_id
AND (T2.kuldes_id = 0
OR T2.szamla_id = 0)
WHERE T1.rendeles_id NOT IN (SELECT rendeles_tmp FROM user);Elég háklis szoktam lenni a rendszerszervezőkre, ha olyan mezőkre is specelnek NOT NULL constraint-t, ahol semmi keresnivalója.
Pláne, hogy a kuldes_id-nek, szamla_id-nek logikusan foreign keynek kellene lennie, ami a kuldes, szamla táblák id mezőjére mutat.
Ott meg szigorúan NULL a gyerek tábla mezője, ha éppen nem mutat a szülő egyik rekordjára se! -
nyunyu
félisten
Sokadik olvasatra sikerült megfejtenem, mit is akart jelenteni ez a sor:
AND rendeles_id NOT IN (SELECT IFNULL(rendeles_tmp,0) FROM user)
Ha jól értem, amíg a felhasználó nyitott egy tranzakciót, akkor az user tábla rendeles_tmp oszlopba íródik be a félkész rendelés ID-je, és ott is marad, amíg be nem fejezi a vásárlást.
(Remélem egy másik "trigger" takarítja a szemetet utána!
Bár én azt nem triggerre bíznám, hanem explicite kiadnám a delete-et a program kódban.
Ha ilyenekre triggereket használtok, ott valami nagyon félrement az alkalmazás tervezésekor/implementálásakor.)Ekkor viszont a querym végére ezt egy WHERE-be kéne írni:
SELECT DISTINCT T1.rendeles_id
FROM rendeles AS T1
JOIN tetel AS T2
ON T1.rendeles_id=T2.rendeles_id
AND (T2.kuldes_id IS NULL
OR T2.szamla_id IS NULL)
WHERE T1.rendeles_id NOT IN (SELECT rendeles_tmp FROM user);IFNULL(rendeles_tmp,0): ezt meg eleve nem értem, miért kell a null értékeket nullára konvertálni?
Ki nem töltött érték/null az nem része a halmaznak (IN), de az ellenkezőjének sem (NOT IN).(Java programozóink szoktak vért izzadni, mert a DBben a null is értelmes érték.
Azt jelenti, hogy nincs adat.)
-
nyunyu
félisten
Juj.
Először sorbarendezted+csoportosítottad a tételeket rendeles_id szerint, azután az ablakozós függvény a csoportokra külön-külön képezett egy eredményt, aztán az eredményhalmazt még egyszer átfésülted a having után írt feltételekkel?
Nem lenne egyszerűbb egy sima joinnal eleve azokra a tételekre szűrni, ahol a kuldes_id vagy szamla_id null?
SELECT DISTINCT T1.rendeles_id
FROM rendeles AS T1
JOIN tetel AS T2
ON T1.rendeles_id=T2.rendeles_id
AND (T2.kuldes_id IS NULL
OR T2.szamla_id IS NULL);Distinctet csak azért tettem bele, hogy a több hiányos tétellel rendelkező rendelések csak egyszer szerepeljenek a listában, anélkül annyiszor kapnád vissza az azonosítóját, ahány tétele rossz.
Így csak egyszer fog végigmenni a táblákon *, majd az eredmény sorbarendezése után kihagyja a duplikációkat.
* vagy azon se, ha a tetel tablan van egy összetett index a rendeles_id, szamla_id, kuldes_id trióra.
-
pch
senior tag
Sziasztok!
Having helyett mit lehetne (ha lehet) az alábbiak megvalósítására? (Illetve van egy subselect is)
van egy rakat tábla, de csak a 3 fontosat említem
rendelés tábla (rendelés id, meg a szokásos dolgok)
tétel tábla (tétel_id, rendeles_id, kuldes_id, szamla_id)
user tábla (user_id, usernev, rendeles_tmp)Ha valaki dolgozik akkor a rendelés id-t berakja az user tábla rendeles_tmp-be egy trigger.
Kellene egy lista amibe azon a rendelések vannak amin akad még tennivaló.
Ezt onnan tudjuk, hogy a kuldes vagy a szamla id a tételnél 0.Most kb ez a lekérdezés:
SELECT T1.redeles_id,
min(T2.kuldes_id) AS kuldes_min,
min(T2.szamla_id) AS szamla_min
FROM rendeles AS T1
LEFT JOIN tetel AS T2 ON T1.rendeles_id=T2.rendeles_id
AND rendeles_id NOT IN (SELECT IFNULL(rendeles_tmp,0) FROM user)
GROUP BY T1.rendeles_id
HAVING kuldes_min=0 AND szamla_min=0
persze mint mondtam van még egy rakat tábla ami a fejléchez van joinolva, de azok nem lényegesek. Pl.: szállítási mód, fizetési mód stb.
A rendelés 35690 bejegyzés míg a tétel 116984.
A min és a having miatt kissé lomha a lekérdezés, azaz 1.22mp-et vár a kliens mire megkapja az adatokat.
Kérdésem, hogy lehet-e valamennyit gyorsítani valahogy?
Indexek természetesen vannak.Köszi!
-
Ispy
nagyúr
válasz
Panhard #5542 üzenetére
Nem teljesen világos, hogy miért adod neki oda a dátumot, ha nem módosítható eleve? Akkor nem is kell neki odaadni....szvsz. És akkor nem kell fölösleges köröket futni.
Egyébként ha már ehhez ragaszkodsz, akkor rakd be egy jwt-be a két dátumot meg a user kódját, és azt rakd be a query stringbe, backenden meg nyomsz egy verifyt és ha nem stimmel eldobod a kérést.
-
Panhard
tag
Igazából az lenne a feladat, hogy egy webcímben GET kérés paramétereként adom meg a kezdő és a záró dátumot. Valahogy így:
http://weboldal.hu?id1=2022-07-10&id2=2022-07-20
De a lényege az lenne, hogy akinek megadom ezt a linket, az ne tudjon másik dátumra lekérdezni. Én a weboldalon legenerálok egy md5-ben lévő dátumot. Esetleg teszek még más karaktereket is mellé, hogy véletlenül se tudjon legenerálni másik dátumra kódot. (ha esetleg rájönne, hogy csak egy dátum van az md5-ben) Ezt elküldöm a felhasználónak. Ezért kellene valahogy így kódolni a paramétereket:http://weboldal.hu?id1=ea88fe6807b44f248329a85debee3c58
Ez így egy dátumra való lekérdezéssel működik is, mert ott az adatbázisban minden sor dátumát át tudom alakítani md5-re és utána csak össze kell hasonlítani a webcímben kapott md5 értékkel. De nekem két dátum között található összes sort kellene lekérdeznem, amit így nem lehet.
Vagy esetleg van másmilyen bevált megoldás arra, hogy a GET kérés paraméterében lévő értékek manipulálásával ne tudjon mást lekérdezni a felhasználó? -
nyunyu
félisten
válasz
Panhard #5540 üzenetére
Nem teljesen értem, hogy mit is szeretnél.
MD5-tel kódolva van letárolva az időbélyeg, és azokra a bejegyzésekre akarsz szűrni amik X és Y dátumok közöttiek?
Az nem lesz egyszerű, mert a hash függvények irreverzibilisek, nem állítható belőlük vissza az eredeti érték, esetedben dátum.
Emiatt a <, >, between operátorokat nem tudod használni két hash érték direkt összehasonlítására.Itt csak azt tudod tenni, hogy kigenerálod X és Y közötti összes dátum MD5 értékét, és azt vizsgálod, hogy az eredeti érték benne van-e ebben a halmazban.
-
Panhard
tag
Sziasztok! Egy lekérdezéssel kapcsolatban lenne egy kérdésem. Egy dátumra kérdezek le úgy, hogy a dátum md5-el van kódolva. Ez így működik is, de csak így egy napot tudok lekérdezni.
SELECT * from tabla where md5(CAST(DATETIME AS DATE)) = 'ea88fe6807b44f248329a85debee3c58'
Hogy lehetne lekérezni egy tartományra, hogy a kezdő és a záró dátumok ugyan így md5-ben vannak. Próbálgattam a BETWEEN utasítással, de nem tudom megcsinálni. Tudnátok ebben segíteni egy kicsit? -
Ablakos
őstag
(Ubuntu 22/mysql 8)
Mi a különbség:
1. ssh promptbólmysql -u root -p
helyes jelszóval beenged.
2. ugyan ez a user/password elhelyezve a .my.cnf -benAccess denied for user 'root'@'localhost' (using password: YES)
-
Coyot
őstag
válasz
metaldog #5534 üzenetére
Azért az sem mindegy így első körben hogy sima backupról beszélünk vagy ténylegesen a db fájl attachról?
Mert db backupból simán tudod restoreolni a 2008as mentést a 2019-re is. Persze az ellenkező irány nemfog menni. És persze ha nincs benne semmi specialitás, esetleg a programozott részén már kivezetett ficsőrők, stb.
-
nyunyu
félisten
válasz
metaldog #5534 üzenetére
Nem túl valószínű, hogy ennyire régit be lehetne importálni.
Itt azt írják, hogy a 2012 támogatása is lejár idén júliusban, jelen pillanatban az a legrégebbi verzió, amit lehet 2019-re upgradelni.
Valószínűbb az, hogy a 2008-as DBdet fel kell upgradelned valami kevesebb, mint 10 évvel frissebbre (2016? 2017?), és csak onnan kiexportálva tudnád betenni egy aktuális verzió alá.
-
metaldog
aktív tag
Sziasztok
Az lenne a kérdésem hogy sqlserver 2017 alá régebbi sqlserver2008-ból az adatbázist file-t ha be importálom akkor az fog-e működni vagyis kompatbilis-e a új server régi adatbázissal?
Előre is köszi.
-
-
nyunyu
félisten
IN operátor+alquery:
select *
from adattabla at
where at.azonosito in (select azonosito from temp);De akár JOINnal is szűrhetsz:
select at.*
from adattabla at
join temp t
on t.azonosito = at.azonosito;Régebben a JOINt javasolták a kétféle megoldás közül, mert az gyorsabb volt, manapság már nincs futási idő különbség, mert a (NOT) INt is (ANTI) JOINra fordítja a DB optimalizálója.
-
válasz
martonx #5526 üzenetére
Van egy selectem, amin kb így néz ki
Select *
From
Adattabla at
Where
at.azonosito = '1234'
Order by created_date asc
Fetch first 1 rows only;Van egy temp táblám, amibe egy oszlop van csak amiben van 1000 azonosító, és ezt szeretném az 1234 helyére beilleszteni, lefuttatni, és az 1000 eredményt egyben látni. Remélem így érthetőbb voltam :)
-
Sziasztok,
van egy táblám, amiben van kb 1000 adat
Van egy selectem, amibe ezt az 1000 adatot egyesével szeretném beillesztve lefuttatni, és az 1000 adattal lefutott eredményt szeretném kiexportálni.
Merre induljak el, mi lehet ilyenkor a megoldás? (Ja, oracle-t használnék)
Köszönöm előre is -
nyunyu
félisten
Szabvány szerint az IN-nek el kell fogadnia egy alquery eredményét is, amennyiben pontosan egy oszlop széles az eredménye, szóval nem értem miért akarod vesszővel felsoroltatni az UNION eredményét, ahelyett, hogy szimplán beírnád az IN utáni zárójelek közé az egész UNIONos queryt.
Ez egy teljesen valid query:
select *
from tabla
where id in (select id from tabla2 where ertek = 1
union
select id from tabla3 where ertek = 2
union
select id from tabla4 where ertek = 3);Végeredménye 0-3 sor lesz, attól függően hány ID van meg a tablaban.
(Oracle megenged több oszlop széles IN-t is, itt arra kell figyelni, hogy ugyanannyi oszlop legyen az IN két oldalán felsorolva:
where (a,b) in (select c,d from tabla);
)Amit te szeretnél, az maximum dinamikus SQLlel oldható meg, amikor futási időben rakod össze stringként a queryt, aztán azt futtatod az erre szolgáló paranccsal (EXEC?), de annak meg jellemzően van valamennyi futási idő overheadje (Oraclenál ~1.5 másodperc?), szóval nem éri a nehezen összerakható, nehezen debugolható kóddal szívni, mert nem lesz gyorsabb.
-
pch
senior tag
Üdv!
mysql UNION-nál kellene nekem olyan megoldás, hogy az eredmény ne egy tábla több sor legyen, hanem egy sorba az összes eredmény (mondjuk vesszővel elválasztva) mint php alatt az implode.
van mondjuk 3 tábla amit union-al összefűzök. mindegyik táblából lekérem az ID-t.
Akkor az eredmény lesz egy ID tábla 3 értékkel.
Van erre valami megoldás, hogy egy sor legyen benne a 3 érték.
Fel szeretném használni egy másik lekérésbe ahol az IN-t fogom használni, csak ugye annak meg sorozat kell.
Azaz később lesz egy SELECT * FROM xy WHERE id IN ( ide jön az union-os összefűzés)
Így most ugye 3 lekérdezést futtatok, ezt szeretném egyre redukálni.Köszi!
-
Hintalow
senior tag
válasz
Apollo17hu #5509 üzenetére
Kicsit megkésve, de köszönöm szépen, ez jónak tűnik
-
nyunyu
félisten
Hja, ha SQL Servert használsz akkor próbálkozhatsz az archaikus Teradata upsert szintaxissal is, hátha megeszi:
(Elvileg 2008R2-vel próbálták átcsábítani a Teradata DWH júzereit, aztán a legacy kód migráció megkönnyítésére implementálták a Teradata szintaxisát is.)update cc
set cc.cust_partnerkod = cc.cust_partnerkod + x.rn
from cikktorzs_customer cc,
(select id, row_number() over (order by id) rn
from cikktorzs_customer
where cust_partnerkod = 200000) x
where cc.id = x.id;(Hmm, MS csak a SET és a WHERE között engedi a FROM utáni tábla felsorolást? Teradatában a SET elé is lehetett írni, sőt legtöbbször úgy írták.)
De a feljebb írt mergenek biztosan működnie kéne, az a több táblát összefésülő műveletek szabványos írásmódja.
FROM clause nagyon nem szabványos az update szintaxisokban, nem sok DB ismeri, kezeli.
(Oracle alatt meg se próbáld!) -
nyunyu
félisten
""Sok fejfájástól megment, ha több tábla joinja alapján kell updatelni egy táblát..." - de ez egy tábla ..."
Meg kell határoznod, hogy
- melyik sorazonosítóhoz
- milyen értéket szeretnél rendelni.
Ezekből létrejön sok (id, érték) páros, ami kvázi egy újabb tábla/nézet/alselect, ezt kell összefésülnöd az eredeti tábláddal, az meg join művelet. -
nyunyu
félisten
azért, mert egy rekordhoz egyszer kell lefusson, de az első update után változik az adatnézet, ha akkor újra kiértékelődik a belső select, akkor már az eggyel növelt értékű rekordot kellene (mármint a logikám szerint) megtalálnia.
Írtál egy alselectet, aminek összesen 1 rekord az eredménye, és értelmes join feltétel híján sikerült Deschartes szoroznod a tábláddal, vagyis minden sorhoz ugyanazt az 1 értéket rendelte hozzá.
Ha az alselectednek nem 1 sor lett volna az eredménye, akkor DB errort kaptál volna, mert egy mezőnek nem lehet egyszerre több értéket adni.
-
Magnat
veterán
válasz
martonx #5513 üzenetére
Selectnél működik:
SET @row_number = 1;
SELECT
(@row_number:=@row_number + 1) AS num,`cust_partnerkod`
FROM cikktorzs_customer WHERE `cust_partnerkod`= 200000De update-nál nem, ugyanarra az értékre updateli az összes érintett sort:
SET @row_number = 1
UPDATE cikktorzs_customer c_c, (SELECT (@row_number:=@row_number + 1) AS num, cust_partnerkod AS i_c_p FROM cikktorzs_customer LIMIT 1 ) i_c_c SET `cust_partnerkod` = cust_partnerkod + @row_number WHERE cust_partnerkod = 200000 -
Magnat
veterán
"Sok fejfájástól megment, ha több tábla joinja alapján kell updatelni egy táblát..." - de ez egy tábla ...
"Egyébként már az updateedet sem értem, miért kéne többször lefutnia az alselectnek, ha egyre limitáltad a visszaadható eredmény számát?" - azért, mert egy rekordhoz egyszer kell lefusson, de az első update után változik az adatnézet, ha akkor újra kiértékelődik a belső select, akkor már az eggyel növelt értékű rekordot kellene (mármint a logikám szerint) megtalálnia.
-
nyunyu
félisten
Javaslom a szabványos merge szintaxis tanulmányozását.
Sok fejfájástól megment, ha több tábla joinja alapján kell updatelni egy táblát...
Egyébként már az updateedet sem értem, miért kéne többször lefutnia az alselectnek, ha egyre limitáltad a visszaadható eredmény számát?
Meg a join feltétel is kompletten hiányzik, ami alapján leválogatnád, hogy melyik rossz sorhoz milyen jó partnerkód tartozna.Ez most pont azt csinálja, hogy leválogatja a legnagyobb partnerkódot, és annyi+1-et ráupdatel minden 200000-es sorra.
Ezzel maximum annyit tudsz csinálni, hogy beteszed egy kurzorba az összes 200000-es sort, aztán egyesével végigiterálva rajtuk mindig eggyel nagyobb értékkel updateled őket.
Vagy valami nagyon elborult merget írsz, ami besorszámozza a sorokat, aztán az alapján updatel:
merge into cikktorzs_customer u
using (select cc.id, cc.cust_partnerkod, row_number() over (order by cc.id) rn
from cikktorzs_customer cc
where cc.cust_partnerkod = 200000) x
on (u.id = x.id)
when matched
then update set u.cust_partnerkod = x.cust_partnerkod + x.rn; -
Magnat
veterán
Üdv,
adott egy tábla (cikktorzs_customer) amiben a cust_partnerkod hibás kód miatt több ezer rekord esetében azonos értéket vett fel (200000). Akarnék egy updatet az érintett rekordokra ami annyit csinál, h kiolvassa a mindig aktuálisan legnagyobb partnerkódot és ahhoz egyet hozzáad.
UPDATE cikktorzs_customer c_c, (SELECT cust_partnerkod AS i_c_p FROM cikktorzs_customer ORDER BY cust_partnerkod DESC LIMIT 1) i_c_c
SET `cust_partnerkod` = i_c_p + 1
WHERE c_c.cust_partnerkod = 200000A gond ezzel annyi, h a belső select nem értékelődik ki újra minden alkalommal, így az összes rekord ami eddig 200000 volt, most 200001 lett. Ki tudja a megoldást?
Előre is köszi annak, aki -
Apollo17hu
őstag
-
Hintalow
senior tag
válasz
sztanozs #5506 üzenetére
Lehet bevettem némi fogalmazásgátlót
1 sor xxy
2 sor xxy
3 sor xyx
stb.Azt szeretném, hogy számolja a az értéket, és mondjuk az xxy-t tartalmazó soroknál egy 2-es menjen minden sor végére, mert 2x szerepel, az xyx sor végére 1-es, ami 10x ugyanaz az érték, ott minden azt az értéket tartalmazó sor végére 10-es stb.
Mintha csak lehúznék egy countif-et végig rajtuk.
-
Hintalow
senior tag
Sziasztok,
Az excel countif funkcióját mivel lehet megcsinálni sql-ben?
Van egy adathalmazom (párszázezer sor) ahol van egy oszlop amiben az érték többszöröződhet, ezt szeretném számolni a kritéria alapján.
Addig jó, hogyCOUNT(CASE WHEN <condition> THEN 1 END)
Viszont nekem nem egy fixált kondíció kéne, hanem hogy adaptívan számolja, hogy melyik karaktersorozat hányszor szerepel (1x, 2x, 3x, 4x stb) -
evko
aktív tag
Nos, lett egy felhasználó, folyamat nevek (4 folyamat), egy folyamatok tábla.
A felhasználókat lehet kezelni...
A folyamatok táblázatba menne a felhasználó id, a folyamat név id, a létrehozás dátuma.Több problémát kellene megoldani, és ehhez minimum 1 tábla kellene még.
Ez már program része, de ha nem jó az adatbázis, nem lesz jó az egész....
Az első 3 folyamatot az admin nyugtázza. Csak akkor lehet a következő folyamatot nyugtázni, ha az előző már nyugtázva van. Ha a 3 folyamat admin részről nyugtázott, a 4. folyamatot a felhasználó (saját felületéről, neki csak felhasználó joga van) tudja nyugzázni. Ezzel a nyugtázással zárja is a saját hónapját... Pl. ma rábökött egy buttonra, amivel nyugtázta a 4. folyamatot, ami automatikusan zárta is az áprilist (ez csak megjelöli az user mellett az áprilist, hogy ok (ad neki 1-es értéket). Tehát, az admin május 28-án csak akkor tud nyugzázni (1-2-3-as folyamatokat), ha az április már zárva van.
Ez most lehet nagyon kesze-kusza lett...És lenne benne még 1 csavar...
Ha a felhasználó alkalmazott (felhasználó típus ), akkor az első folyamat nyugtázásával (admin nyom a buttonra) nyugtázódik automatikusan a 2-es és 3-mas folyamat is....
Engem az érdekelne, hogy ezt így hogy lehetne táblázat szinten kezelni... A programozás része más kérdés... Az egyszerű részek még mennek... A többi majd kialakul.. Csak jó lenne, ha az adatbázisba jól lehetne ezeket az adatokat beilleszteni, illetve lekérdezni majd.
-
evko
aktív tag
Köszönöm.
Nem szeretnék spórolni és nem egyedül csinálom (ez egy sulis feladat), csak elakadtunk.
De normálisan nem is volt megtervezve az adatbázis... És azt gondolom, ez itt az alapvető probléma. Mert, ha nincs alap, hogyan építkezzek?Ez egy kis adatbázis lesz, kb 30 fő adatait tárolja.
De igazad van, így jobban kezelhető.
Név mellé a hónapokat (szept, okt, nov..) úgy kérdezem le/jelenítem meg (és módosítom, írom), hogy adott hónapra kérdezve jelenítem meg a folyamatok táblázatból az adatokat, létrehozás dátuma alapján?Nah, délután összerakom valamennyire.
-
Miért szeretnél spórolni a táblákon?
Sokkal átláthatóbb lesz, és könnyebben bővíthető, ha külön fogalmakra külön tábla van.Én 5 táblából indulnék ki:
- felhasználók (id, jog id, név... stb.*)
- jogok (id, név...)
- folyamat típusok (id, név...)
- folyamat állapotok (id, név...)
- folyamatok (id, felhasználó id, folyamat típus id, állapot id...)*: állapot azonosító, létrehozás dátuma, egyéb szépségek
Esetleg külön állapot táblák a felhasználókra, jogokra is.
-
evko
aktív tag
Sziasztok!
Hogyan, hány táblával lehetne azt megoldani, hogy:
-vannak felhasználók, különböző jogokkal (admin, user, stb). Ez nyilván 1 tábla.
-vannak folyamatai (aktív volt, fizetését kiutalták). Minden usernek külön folyamata van. Talán ez még belefér az user táblába (process 1,2,3...)?
-Es ezeket a folyamatokat havonta adminisztrálni.
-ha adott user adott havi minden folyamata aktív, adott hónapot aktívvá tenni. Tehát 1 hónapban adott user minden folyamat ok, akkor hónap is ok legyen végül.Ezeket kellene táblázatban kezelni...
Én 2 vagy 3 táblára gondolok, de nem vagyok tervező, itt biztos, hogy van nálam sokkal okosabb,aki tudja, milyen szerkezettel lehetne ezt jól menedzselni.Köszi a segítséget!
Új hozzászólás Aktív témák
Hirdetés
- Stellar Blade
- Egy szenzor, két zoomkamera: újraírta a Huawei a mobilfotózás történetét
- PlayStation 5
- Parfüm topik
- BestBuy topik
- bitpork: Augusztus 2- szombat jelen állás szerint.
- Megjelent a Red Magic kompakt OLED kijelzős gaming táblagépe
- Nvidia GPU-k jövője - amit tudni vélünk
- Motoros topic
- ThinkPad (NEM IdeaPad)
- További aktív témák...
- Felújított számítógépek/merevlemezek Számlával, garanciával! Ingyen Foxpost!
- Acer Nitro 5 -AN515 - 15.6"FHD IPS 144Hz - i7-11800H - 16GB - 512GB SSD+1TB HDD -RTX 3050 - Garancia
- AKCIÓ! Apple Macbook Pro 15" 2018 i9 9850HK 32GB 500GB 560X 4GB garanciával hibátlan működéssel
- BESZÁMÍTÁS! GIGABYTE AORUS ELITE Z790 i7 14700K 64GB DDR5 1TB SSD 7900XTX 24GB be quiet! SB802 1000W
- BESZÁMÍTÁS! Dell Precision 5820 XL Tower PC - Xeon W-2123 112GB RAM 512GB SSD 1TB RX 580 8GB Win 11
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged