ČasProBydlení  |  TechSvět  |  MyMuži  |  HobbyDeník  |  ČasProŽeny  |  ByznysDeník  |  VipShow  |  MotorGuru  |  Pravda24  |  NeposlušnéTlapky

Přispívat do fóra mohou pouze pravidelní uživatelé Roumingu.

Zobrazení je omezeno na jedno vlákno! Vrátit se k zobrazení všech vláken.

 

re: SQL dotaz, help please (mi0RP (21.11.2016 13:44)
janci: Sakra, pravdu máš.. :D 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 (janciRP (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 (retroRP (21.11.2016 13:30)
mi0: No to se nedá takhle lehce zjistit. Máš fotku Simony?
 
re: SQL dotaz, help please (mi0RP (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 (mi0RP (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 (janciRP (21.11.2016 13:04)
mi0 teraz aj tak napise ze chcel nieco uplne ine :o)
 
re: SQL dotaz, help please (MemRP (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 (janciRP (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 (mi0RP (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 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 (koalaRP (14.10.2016 20:40)
parada, takze si vyhral.. a ja som sa naucil novu fciu.. win-win :)
 
re: SQL dotaz, help please (mi0RP (14.10.2016 16:15)
Ale skúsil som a funguje.. tu máte výsledky :)
[odkaz]
 
re: SQL dotaz, help please (koalaRP (14.10.2016 16:05)
takze moj posledny nevyskusas? no pekne od teba >-O
 
re: SQL dotaz, help please (mi0RP (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 (koalaRP (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 (ziaRP (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 (koalaRP (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 (mi0RP (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 :P
 
re: SQL dotaz, help please (koalaRP (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 :-D
EDIT: koala - 14.10.2016 15:20:23
 
re: SQL dotaz, help please (mi0RP (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 (koalaRP (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 (mi0RP (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 (RoumenR (14.10.2016 15:01)
To je pekne. 8-)
 
re: SQL dotaz, help please (koalaRP (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 (RoumenR (14.10.2016 14:15)
Ten tvuj jsem nepochopil, tak mozna dela co chces. :o)
 
re: SQL dotaz, help please (mi0RP (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 (RoumenR (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. 8-)

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 (DnFRP (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 (mi0RP (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 (RoumenR (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 (mi0RP (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
 
 


Tento web používá k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Podmínky pro uchovávání nebo přístup ke cookies je možné nastavit ve vašem prohlížeči. Více...