ČasProBydlení | TechSvět | MyMuži | HobbyDeník | ČasProŽeny | ByznysDeník | VipShow | MotorGuru | Pravda24 | NeposlušnéTlapky |
re: SQL dotaz, help please (mi0) RP (21.11.2016 13:44) ⇥ |
↻ |
janci: Sakra, pravdu máš.. Som zabudol doplniť podmienku do toho posledného selectu v HAVING podmienke Fíha, tento postup ma nenapadol, ešte že som sa spýtal. Dík. | |
re: SQL dotaz, help please (janci) RP (21.11.2016 13:33) ⇥ |
↻ |
tak ked to groupnes este podla B.a_id tak je to to co chces, nie? | |
re: SQL dotaz, help please (retro) RP (21.11.2016 13:30) ⇥ |
↻ |
mi0: No to se nedá takhle lehce zjistit. Máš fotku Simony? | |
re: SQL dotaz, help please (mi0) RP (21.11.2016 13:11) ⇥ |
↻ |
...preto som písal o tom INTERSECTe, že to by mi vyhodilo prienik, ktorý potrebujem, ale bol by to cyklus v cykle, tak sa pýtam, či sa to dá nejak rozumnejšie... | |
re: SQL dotaz, help please (mi0) RP (21.11.2016 13:09) ⇥ |
↻ |
janci: ee, toto som nechcel Tabuľka A je v podstate teraz nepodstatná, tá by sa použila len na definovanie rozsahu B záznamov (tj. WHERE B.fk_A = xyz) Každopádne, príklad na pochopenie: Tabuľka A = ŽENA Tabuľka B = POMER s riadkami: ANAL, ORAL, VAGINAL Tabuľka C = MUŽ s menami mužov. A ja teraz chcem nájsť všetkých chlapov, ktorí so Simonou mali všetky tri typy pomeru - (A) Simona -- (B): ANAL: --- (C): Jožo, Fero, Peter -- (B): ORAL: --- (C): Fero, Peter -- (B): VAGINAL: --- (C): Peter, Marek, Tibor A chcem, aby mi to vypľulo Petra, lebo ten si užil najviac |
|
re: SQL dotaz, help please (janci) RP (21.11.2016 13:04) ⇥ |
↻ |
mi0 teraz aj tak napise ze chcel nieco uplne ine | |
re: SQL dotaz, help please (Mem) RP (21.11.2016 12:50) ⇥ |
↻ |
Možná to ještě omezit klíčem na A? Tj. brát jen z těch B, které patří do A? To už si ovšem snadno může doplnit laskavý čtenář. | |
re: SQL dotaz, help please (janci) RP (21.11.2016 12:42) ⇥ |
↻ |
SELECT C.hodnota FROM B JOIN C ON B.id = C.b_id GROUP BY C.hodnota HAVING Count(B.id) = (SELECT Count(*) FROM B) tj vyberies tie hodnoty z C, ktore maju v B tolko vyskytov, ktolko ma B riadkov = opakuju sa v B vo vsetkych zaznamoch ale neviem ci je to co si chcel a neviem ci je podstatne nieco z tabulky A EDIT: janci - 21.11.2016 12:43:07 EDIT: janci - 21.11.2016 12:44:11 |
|
re: SQL dotaz, help please (mi0) RP (21.11.2016 12:14) ⇥ |
↻ |
Tak, mám tu ďalší quest ohľadom PL/SQL a tentoraz ma akosi nič nenapadá. Potrebujem nájsť hodnoty, ktoré sa opakujú pre všetky riadky v podvesenej tabuľke v podvesenej tabuľke Dá sa nejak spraviť prienik nad N riadkami nejakej tabuľky? Pre pochopenie: Tabuľka A má podvesenú tabuľku B a tá má zase podvesenú tabuľku C. Čiže riadok v tabuľke A má x záznamov v tabuľke B a každý jeden záznam z B má y hodnôt v tabuľke C. A teraz chcem zistiť, ktoré hodnoty z C sa opakujú pre všetky záznamy v B. Dá sa to spraviť inak než cez dva vnorené loopy a INTERSECT medzi jednotlivými riadkami z tabuľky C? |
|
re: SQL dotaz, help please (koala) RP (14.10.2016 20:40) ⇥ |
↻ |
parada, takze si vyhral.. a ja som sa naucil novu fciu.. win-win | |
re: SQL dotaz, help please (mi0) RP (14.10.2016 16:15) ⇥ |
↻ |
Ale skúsil som a funguje.. tu máte výsledky [odkaz] |
|
re: SQL dotaz, help please (koala) RP (14.10.2016 16:05) ⇥ |
↻ |
takze moj posledny nevyskusas? no pekne od teba | |
re: SQL dotaz, help please (mi0) RP (14.10.2016 16:02) ⇥ |
↻ |
A heleme se.. ten príklad od zia funguje (až na tú drobnosť, ako napísal koala). Teraz si spravím prefomance test, že čo je výhodnejšie | |
re: SQL dotaz, help please (koala) RP (14.10.2016 15:57) ⇥ |
↻ |
zia: skoro dobre, ale nie uplne.. dopln si tam napr: insert into x values(5, 'dn', 'c' Tvoj vysledok da zbytocny riadok navyse. Je to sposobene nestatnym vnorenym selektom, kde vyberas vsetky key2 bez ohladu na locale.. Prepisal som to moje aj do tsql: select distinct isnull(tA.key2, tB.key2) as k , case when tA.key2 is NOT NULL then tA.name else tB.name end as name , case when tA.key2 is NOT NULL then tA.locale else tB.locale end as locale from x tA full join x tB on tA.key2 = tB.key2 and tA.locale = 'a' and tB.locale = 'b' where tA.locale = 'A' or tB.locale = 'B' EDIT: koala - 14.10.2016 15:57:58 |
|
re: SQL dotaz, help please (zia) RP (14.10.2016 15:47) ⇥ |
↻ |
Oracle sice neznam, ale v MSSQL by to mohlo vypadat takto: drop table x go create table x (key2 int, name varchar(max), locale varchar(max)) go insert into x values(1, 'na', 'a' insert into x values(1, 'bn', 'b' insert into x values(2, 'nc', 'a' insert into x values(3, 'dn', 'b' select isnull(a.key2, b.key2) as key2, isnull(a.name, b.name) as name, isnull(a.locale, b.locale) as locale from ( select key2 from x group by key2 )x left join x as a on x.key2 = a.key2 and a.locale = 'a' left join x as b on x.key2 = b.key2 and b.locale = 'b' |
|
re: SQL dotaz, help please (koala) RP (14.10.2016 15:47) ⇥ |
↻ |
no tak to teda nie! uz ked sme zacali, tak do dokoncime..takto by to malo fungovat, ale zda sa mi to uz komplikovanejsie ako to tvoje.. select distinct nvl(tA.key, tB.key) as k , case when tA.key is NOT NULL then tA.name else tB.name end as name , case when tA.key is NOT NULL then tA.locale else tB.locale end as locale from table1 tA full join table1 tB on tA.key = tB.key and tA.locale = 'A' and tB.locale = 'B' where tA.locale = 'A' or tB.locale = 'B' |
|
re: SQL dotaz, help please (mi0) RP (14.10.2016 15:27) ⇥ |
↻ |
Bez zmeny.. Stále len prienik... kašli na to, použijem ten môj variant - ten funguje a či je to optimálne - na to prdí pes | |
re: SQL dotaz, help please (koala) RP (14.10.2016 15:19) ⇥ |
↻ |
ano, lebo ja som myslel FULL OUTER JOIN miesto inner ale nenapisal som ho tam skus.. edit: samozrejme nie cross join..piatok EDIT: koala - 14.10.2016 15:20:23 |
|
re: SQL dotaz, help please (mi0) RP (14.10.2016 15:16) ⇥ |
↻ |
Zle som sa vyjadril - teraz to vracia len prienik tých dvoch skupín (tj. vracia to len tie kľúče, ktoré majú aj locale A a zároveň aj locale B. Chýbajú kľúče, ktoré majú len locale A alebo len locale B. Príklad: KEY, NAME, LOCALE --------------------------- 1, na, a 1, bn, b 2, nc, a 3, dn, b A potreboval by som selekt, ktorý vráti: 1-na-a, 2-nc-a, 3-dn-b. Tvoj príklad vráti len 1-na-a. |
|
re: SQL dotaz, help please (koala) RP (14.10.2016 15:11) ⇥ |
↻ |
Ved tak to mas v zadani.. vratit jeden pre locale 'A' a ked neexistuje, vratit pre 'B' Daj konkretny priklad, ktory by to malo vratit pls. | |
re: SQL dotaz, help please (mi0) RP (14.10.2016 15:03) ⇥ |
↻ |
Problém je, že Oracle ti serie na DISTINCT/GROUP BY jednoho stĺpca, on vyberie unikátne záznamy zo všetkých vymenovaných stĺpcov. Takže aj tento tvoj príklad vypíše všetky kombinácie kľúčov pre všetky locale a nie len 1 kľúč pre jedno z menovaných locale... EDIT: Po tej tvojej úprave to teraz vracia po správnosti len 1 kľúč, ale zase len pre 1 jazyk (ten druhý ignoruje). Ale je to krajší zápis ako cez to FIRST_VALUE, už len trochu doladiť, aby to fungovalo EDIT: mi0 - 14.10.2016 15:06:01 EDIT: mi0 - 14.10.2016 15:07:32 |
|
re: SQL dotaz, help please (Roumen) R (14.10.2016 15:01) ⇥ |
↻ |
To je pekne. | |
re: SQL dotaz, help please (koala) RP (14.10.2016 14:57) ⇥ |
↻ |
Neviem ci som to spravne pochopil, ale neslo by ten roumenov upravit takto aby to fungovalo? Zaroven neviem ci je to jednoduchsie, ale minimalne by si nebol zavisly od sortovania v tvojom pripade..kedy je nutne mat jazyk 'A' skor v abecede ako 'B'.. select distinct nvl(tA.key, tB.key) as key , case when tA.key is NOT NULL then tA.name else tB.name end as name , case when tA.key is NOT NULL then tA.locale else tB.locale end as locale from table1 tA join table1 tB on tA.key = tB.key where tA.locale = 'A' and tB.locale = 'B' EDIT: koala - 14.10.2016 14:59:39 |
|
re: SQL dotaz, help please (Roumen) R (14.10.2016 14:15) ⇥ |
↻ |
Ten tvuj jsem nepochopil, tak mozna dela co chces. | |
re: SQL dotaz, help please (mi0) RP (14.10.2016 14:00) ⇥ |
↻ |
Takže Roumenův príklad má problém v tom, že pre jeden key existuje viac textov (tj. je viac jazykov), takže takto napísaný select vráti všetky texty. A dokonca to ignoruje aj WHERE podmienku, takže to vypíše všetky riadky. Okrem toho, DISTINCT nemá efekt Asi na to hodím bobek a použijem ten môj príklad z úvodu, ten funguje. | |
re: SQL dotaz, help please (Roumen) R (14.10.2016 11:17) ⇥ |
↻ |
Jestli chces to co si myslim, tak neco jako (od boku): select t1.key, nvl(t1.value, t2.value) from table t1 join table t2 on t1.key=t2.key where t1.key='A' or t2.key='b' Urcite to bude zlobit kdyz v t1 nebude key, ale to uz by se dalo poresit. Nejak pridat do joinu left a vybirat key z t1 i t2 a resit to dal...nebo tak nejak. Jinak nvl pri vyberu sloupcu nic nezere. Oraclu je to jedno...uz ma vsechna data v ruce a uz to jen sklada. Ted jsem to pro jistotu i overil v explainu...nvl nemeni plan, nema vliv na cost. Rychlostne stejne. Zkousel jsem na stredni tabulce (1.4Mrows). EDIT: Roumen - 14.10.2016 11:27:41 |
|
re: SQL dotaz, help please (DnF) RP (14.10.2016 11:14) ⇥ |
↻ |
nvl me napadlo, ale je to docela performance zrout. Co treba napred udelat count A a podle toho selectnout bud A nebo B? Jak to napsat v oraclu ale negooglim | |
re: SQL dotaz, help please (mi0) RP (14.10.2016 11:13) ⇥ |
↻ |
Možná jo.. nevím, dám si teď pauzu (tj. pořeším jiné věci) a pak se na to podívám z jiného úhlu... | |
re: SQL dotaz, help please (Roumen) R (14.10.2016 11:09) ⇥ |
↻ |
Z toho mi asi vybouchne hlava. Nebylo by lepsi udelat join sama se sebou a pak pouzit nvl? EDIT: Roumen - 14.10.2016 11:12:08 |
|
re: SQL dotaz, help please (mi0) RP (14.10.2016 10:53) ⇥ |
↻ |
Kua, mňa z toho Oraclu asi ebne... Ako sa dajú čo najjednoduchšie vytiahnuť z lokalizačnej tabuľky (tj. stĺpce KEY, NAME, LOCALE) všetky unikátne kľúče pre jazyk A a ak taký neexistuje, tak pre jazyk B? Toto som vytvoril, ale nedá sa to nejak ľahšie? SELECT DISTINCT key, FIRST_VALUE(name) OVER(PARTITION BY key ORDER BY locale asc) , FIRST_VALUE(locale) OVER(PARTITION BY key ORDER BY locale asc) FROM table1 where locale = 'A' or locale = 'B'; EDIT: mi0 - 14.10.2016 10:54:25 |
|