Vonatkoztass el a látottaktól annyiban, hogy az 'csak' egy tábla kimeneti megjelenítése, mindegy hogy 3 vagy akárhány oszlopról van szó a megvalósítást illetően.
A téma az lenne amit és ahogy írtam, ez egy tábla oszlopaiban lévő különböző értékek. annyi, hogy azok előfordulását (számosságát) mindig az oszlop mellé tett count értékeket tartalmazó +1 oszlopba kellene tenni.
Gyakorlatilag ezt query-t kellene a példa output szerint 'összetenni egymás MELLÉ':
SELECT A.oszlop_1, COUNT(t.oszlop_1) db FROM table A GROUP BY A.oszlop_1 ;
SELECT A.oszlop_2, COUNT(t.oszlop_2) db FROM table A GROUP BY A.oszlop_2 ;
SELECT A.oszlop_3, COUNT(t.oszlop_3) db FROM table A GROUP BY A.oszlop_3 ;
Table created SQL> INSERT INTO scott.emp 2 (empno, ename, job, mgr, hiredate, sal, comm, deptno) 3 SELECT empno - 4000, 4 ename, 5 job, 6 mgr, 7 hiredate, 8 CASE 9 WHEN job = 'MANAGER' THEN 10 sal + 100000000 11 ELSE 12 sal 13 END sal, 14 comm, 15 deptno 16 FROM scott.emp log errors 17 INTO scott.hiba_ora('EMP INSERT ERRORS') reject LIMIT unlimited;
22 rows inserted
SQL> SELECT ORA_ERR_MESG$, ORA_ERR_TAG$, EMPNO FROM scott.hiba_ora;
ORA_ERR_MESG$ ORA_ERR_TAG$ EMPNO --------------------------------------------------------------------------------------------------- ------------------------ -------- ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3566 ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3698 ORA-01438: a megadott érték hosszabb, mint amelyet az oszlopra definiált pontoss EMP INSERT ERRORS 3782
SQL> drop table scott.hiba_ora purge;
Table dropped SQL> delete from scott.emp t 2 where t.empno not in (7369,7499,7521,7566,7654,7698,7782,7788,7839,7844,7876,7900,7902,7934);
mi az hogy sok? copy paste csodákra képes. 100 felett meg írnék egy selectet ami előállítja a selecttet ami kell. nem érdemes sok energiát tenni bele, mert csak egyszer kell.
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%)