Keresés

Részletes keresés

stopposbácsi Creative Commons License 2015.11.17 0 0 5448

Na igen, csak vajon melyik oszlop lehet a sok közül?

Előzmény: halaloszto (5447)
halaloszto Creative Commons License 2015.11.17 0 0 5447

ha egy temp táblába le tudtad tolni, és abba belefért, akkor abból le tudod kérdezni hogy melyik sorban van túl nagy szám.

Előzmény: halaloszto (5446)
halaloszto Creative Commons License 2015.11.17 0 0 5446

egy insert vagy update csinálja?

 

az a sor még nem létezik mert nem létezhet, nem tudod elkapni.

 

Vagy az insert/update egy táblából megy, és a forrás sort akarod elkapni? sok sor van?

Előzmény: stopposbácsi (5444)
NevemTeve Creative Commons License 2015.11.17 0 0 5445

Csak úgy általában "dob egy olyan hibaüzenetet", vagy konkrétan valamilyen program valamilyen utasítás végrehajtása során?

Előzmény: stopposbácsi (5444)
stopposbácsi Creative Commons License 2015.11.17 0 0 5444

Akkor egy idegesítő kérdés. :)

 

Ha  dob egy olyan hibaüzenetet, hogy ORA-01438: value larger than specified precision allowed for this column, akkor mi a legegyszerűbb módja kitalálni, hogy melyik oszloppal van a problémája?

 

Megpróbáltam egy create table-t, hogy összehasonlítsam, de legalább 12 oszopból csinált numbert, az eddig number(9) helyett.

 

Azért kérdezem, mert igazából azt a sort kellene elkapnom, ami hibás, nem a táblastruktúrán változtati.

 

Köszönöm

F1DO Creative Commons License 2015.11.11 0 0 5443

Egyben előterjesztem, hogy akinek van tudomása 'haladó sql témájú', minőségi oldalról - megoszthatná a közönséggel, hogy pl kevesebb idegesítő kérdést tegyenek fel itt... :-)

F1DO Creative Commons License 2015.11.11 0 0 5442

'Csakhogy minőségi content' is legyen - 

Kezdőknek sql join-okról oldal - az eddigi legjobb általam talált magyarázattal -

http://www.w3resource.com/sql/joins/sql-joins.php

halaloszto Creative Commons License 2015.11.04 0 0 5441

Találtam egy egész elfogadhatót!

 

 

select f1,f2 from

(

  select f1, f2, count(*) over (partition by f1) f1count, count(*) over (partition by f2) f2count

  from tabla

)

where f1count=1 and f2count=1;

 

Csak egyszer megy végig a táblán, cserébe persze csinál két sortot. És egész olvasható.

Előzmény: halaloszto (5440)
halaloszto Creative Commons License 2015.11.04 0 0 5440

Az zavart benne, hogy ez háromszor nyálazza át a táblát.

 

Alkottam egy sokkal jobbat, a cost is harmada, csak kétszer olvassa végig és egyszer hash join, és gyorsabb is.

 

select a.f1, a.f2 

from

 (select f1, max(f2) f2 from tabla group by f1 having count(*)=1) a

 (select max(f1) f1, f1 from tabla group by f2 having count(*)=1) b

where a.f1=b.f1 and a.f2=b.f2;

 

Nem mondom hogy tetszik, de tűrhetóen fut.

 

Vajk

 

Előzmény: NevemTeve (5435)
halaloszto Creative Commons License 2015.11.03 0 0 5439

a teszteset generálás egy külön tudás. kell hozzá egy kis ismeret meg tapasztalat, de hamar sikerül olyan adatot generálni ami tuti hozza egy ilyen query minden részletét.

 

Vajk

Előzmény: F1DO (5437)
NevemTeve Creative Commons License 2015.11.03 0 0 5438

(Figyelmedbe ajánlanám az 5426-ost.)

Előzmény: F1DO (5437)
F1DO Creative Commons License 2015.11.03 0 0 5437

A nyers 'futtassuk le a két különbözően megírt kódot és nézzük meg mi lesz az eredménye, hogy abból következtessük ki hogyan működik' elv nem minden esetben helyes vagy követendő..

Sok függ attól hogy milyen adathalmazra nézzük meg a példát..
Futottam már bele abba hogy egy aggregálásra két különböző QUERY ugyanazt az eredményt hozta, pedig logikai különbség volt köztük, ami egy másik alkalommal egy eltérő logikai aggregálás mentén ki IS bukott..

Előzmény: NevemTeve (5431)
halaloszto Creative Commons License 2015.11.03 0 0 5436

pedig a kurrens melóm :-(

persze nem emberek és életkorok, de majdnem. és persze van a táblában egy aktív-nem aktív mező is, meg pár egyéb bonyolítás. csak lecsupaszítottam hogy a lényegre lehessen koncentrálni, ettől persze feladványszerűvé vált, mert azok is ilyen csupaszok.

 

Vajk

Előzmény: NevemTeve (5435)
NevemTeve Creative Commons License 2015.11.03 0 0 5435

Vagy pedig két NOT EXIST a WHERE-ben. Nem lesz gyors.
(Egyébként nekem ez a kérdés is elég 'feladványszerűnek' tűnik, arra pedig van külön topik.)

Előzmény: halaloszto (5434)
halaloszto Creative Commons License 2015.11.03 0 0 5434

ez nem az. a kombinációk egyediek. de én azt akarom hogy ha van több sándor akkor minden sándor essen ki, és ha van több 18 éves akkor az összes 18 éves essen ki.

 

egy csúnya megoldás:

 

select f1, f2 

from tabla

where f1 in (select f1 from tabla group by f1 having count(*)=1)

   and f2 in (selec f2 from tabla group by f2 having count(*)=1);

 

de ez egyrészt nem túl szép, másrészt a nemkicsi táblán igen brutál hash merge-ket csinál.

 

Vajk

Előzmény: NevemTeve (5433)
NevemTeve Creative Commons License 2015.11.03 0 0 5433

SELECT fld1, fld2, COUNT(*)

...

GROUP BY fld1, fld2

HAVING COUNT(*)=1

Előzmény: halaloszto (5432)
halaloszto Creative Commons License 2015.11.03 0 0 5432

akkor egy gyakorlati kérdés:

 

van egy lista elempárokból. pisti-21, kati-18, sanyi-36, julcsi-21 és így tovább.

ki kell venni azokat, amiknél mindkét elem egyedi. tehát a fenti felsorolásból pisti és julcsi kiesnek, mert mindketten 18 évesek. minden 18éves kiesik mert a 18 nem egyedi. ha lenne egy sanyi-19, akkro ő is kiesne, és a másik sanyit is kiütné.

 

hogyan lehetne ezt kulturáltan leírni? gusztustalan de logikailag helyes megoldásom van. 

további információ hogy viszonylag sok rekord van (egyelőre 2M), és kevés a dupla (1-3%)

 

Vajk

NevemTeve Creative Commons License 2015.11.03 0 0 5431

És miért nem próbálod ki inkább?

További lehetőségek: MINUS, WHERE NOT EXISTS

Előzmény: F1DO (5430)
F1DO Creative Commons License 2015.11.02 0 0 5430

A kérdés mindössze az hogy pusztán szintaktikai, vagy logikai eltérés is van-e a két select között..

tanárnéni kedvence Creative Commons License 2015.11.02 0 0 5429

Sajnos velem előfordul az is, hogy a rosszfej még nálunk dolgozik, ennek ellenére elnyerem a projektjét.

Előzmény: halaloszto (5426)
givons2 Creative Commons License 2015.11.02 0 0 5428

Ezt akár én is írhattam volna...

Maximálisan egyetértek.

Előzmény: halaloszto (5426)
dorog.zultan Creative Commons License 2015.11.02 0 0 5427

Ha már létre lett hozva, ne legyen hiába, válaszoltam az Oracle rejtvények topicban :)

Előzmény: F1DO (5425)
halaloszto Creative Commons License 2015.11.02 0 2 5426

a valóságban előbb tudjuk hogy mit akarunk, és utánna írjuk a query-t. 

és olyan query-t írunk, ami nem rejtvény, hanem olyan hogy látsszon rajta hogy mit akarunk. 

 

valós esetben kizárólag úgy fordul elő hogy ezt meg kell értsük, ha egy rosszfej írta aki már nem dolgozik nálunk, és most hamar ki lesz cserélve egy olvashatóra.

 

Vajk

Előzmény: F1DO (5425)
F1DO Creative Commons License 2015.11.02 0 0 5425

Nekem mindegy, azonban ez egy valós megválaszolandó kérdés.. :-)

 

És itt még mindig nagyobb az élet mint a másik topicban..

Előzmény: NevemTeve (5424)
NevemTeve Creative Commons License 2015.10.31 0 1 5424

(mi lenne, ha ez a topik megmaradna a valódi kérdéseknek, az "agytorna" meg mondjuk menne ide: Oracle rejtvények)

Előzmény: F1DO (5422)
tanárnéni kedvence Creative Commons License 2015.10.30 0 0 5423

Egyformán értelmetlennek tűnik mindkettő.

Előzmény: F1DO (5422)
F1DO Creative Commons License 2015.10.30 0 0 5422

JOIN agytorna 3 :-)

 

Kis írásbeli eltérés - jelenthet-e logikai különbséget?

 

select *

from A left join B on A.kulcs = B.kulcs where B.kulcs is null               

;

 

select *

from A left join B on A.kulcs = B.kulcs and B.kulcs is null      

 

?       

halaloszto Creative Commons License 2015.10.02 0 0 5421

az elso hozza a tabla minden sorat mindenkeppen, ha az ID nem egyedi akkor azokat amik megfelelnek a szuresnek annyiszor ahany van belole, ami nem felel meg azt csak egyszer.

 

a masodik mindet csak egyszer hozza es csak azokat amikre a szuro igaz. az outer join nem szamit, mert minden ID-nek van parja a selfjoin miatt. ha az id nem egyedi, akkor itt is tobbszorozodnek a sorok a selfjoin miatt.

 

Vajk

 

 

Előzmény: F1DO (5419)
F1DO Creative Commons License 2015.10.02 0 0 5420

(tipikus interjú példa feladat egyike..)  :-)

Előzmény: halaloszto (5418)
F1DO Creative Commons License 2015.10.02 0 0 5419

Join agytorna 2   :-)

 

Eredmény tekintetében van különbség a két query között? (mindenhol ugyanarról az egyetlen forrás tábláról van szó)

 

SELECT A.*
FROM table_ugyanaz A,
(SELECT * FROM table_ugyanaz A WHERE A.szuro = valami ) B
WHERE A.id = B.id(+)

 

-----

 

SELECT A.*
FROM table_ugyanaz A,
          table_ugyanaz B
WHERE B.szuro = valami
AND A.id = B.id(+)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!