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.
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... :-)
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.
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..
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.
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.
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%)
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.
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.