Keresés

Részletes keresés

NevemTeve Creative Commons License 2016.07.18 0 0 5577

Off: Most rock journalism is people who cannot write interviewing people who cannot talk for people who cannot read. (Frank Zappa)

 

Na ilyen az ámítástechnika is: a szervező nem tud szervezni, a programozó nem tud programozni, és persze ennek az eredményét a felhasználó sem tudja felhasználni.

F1DO Creative Commons License 2016.07.18 0 0 5576

Pontosan..

pl mindehhez elég ha van egy-két 'gazdag' fantáziával megáldott adatelemző/manager az ember munkahelyén, akik biztosítják, hogy részed legyen a változatos esetekben.

 

 

 

Előzmény: brioska (5575)
brioska Creative Commons License 2016.07.17 0 0 5575

Az élet irdatlan nagy marhaságokat tud produkálni.

 

De talán nem leszek megint közel 4 hónapig topic gyilkos :)

Előzmény: tanárnéni kedvence (5574)
tanárnéni kedvence Creative Commons License 2016.07.15 0 0 5574

Ne zavard már össze a topicot ilyen közel életszerű SQL utasításokkal! ;)

Előzmény: brioska (5570)
F1DO Creative Commons License 2016.07.15 0 0 5573

... tehát egyik helyen egy update-elendő oszlop az id, a másikon meg kulcs oszlop ( egy másik id oszloppal...)

Előzmény: F1DO (5572)
F1DO Creative Commons License 2016.07.15 0 0 5572

Igen, jogos a kérdés (csodálkoztam is hogy nincs erre rákérdezés) az eredeti feladatban id-t is updatelni kellett (a kulcsolás egy másik id-val történt) ezt rosszul adatam példába, elnézést.

Előzmény: brioska (5567)
F1DO Creative Commons License 2016.07.15 0 0 5571

Köszi, egy kis kiegészítés - pontosítás:

 

.. WHEN MATCHED THEN UPDATE SET ...

Előzmény: halaloszto (5563)
brioska Creative Commons License 2016.07.15 0 0 5570

na, szóval így gondoltam :)

 

UPDATE B SET adat = (SELECT MAX(A.adat) FROM A WHERE A.id = B.id)
WHERE EXISTS (SELECT 0 FROM A WHERE A.id = B.id AND A.adat IS NOT NULL);

Előzmény: halaloszto (5569)
halaloszto Creative Commons License 2016.07.15 0 0 5569

én is az övére írtam :-)

Előzmény: brioska (5567)
brioska Creative Commons License 2016.07.15 0 0 5568

úgy értem group by nélkül :)

Előzmény: brioska (5567)
brioska Creative Commons License 2016.07.15 0 0 5567

De külső tábla egyébként is beszűri arra az id-re, azon belül a MAX(adat) elég önmagában.

(F1DO írására vonatkozott a kérdés, nem a tiedre)

 

Előzmény: halaloszto (5566)
halaloszto Creative Commons License 2016.07.15 0 0 5566

a group by azért kell, hogy id-nként csak egy sorunk legyen. az azonos id-k egy group. a max(adat) a groupon belül a legnagyobb adatot adja vissza. a max(id) felesleges, hiszen a groupban csak egyféle id van. a distinct is felesleges, a group by miatt minden sorban más lesz az id.

 

Vajk

Előzmény: brioska (5565)
brioska Creative Commons License 2016.07.15 0 0 5565

köszi, ezt eddig nem ismertem

Előzmény: halaloszto (5563)
brioska Creative Commons License 2016.07.15 0 0 5564

miért kell bele a DISTINCT és a GROUP BY?

Előzmény: F1DO (5562)
halaloszto Creative Commons License 2016.07.14 0 2 5563

merge into B target using (select max(adat) adat, id from a where adat is not null group by id) source

on (target.id=source.id)

when matched then set target.adat=source.adat;

 

Előzmény: F1DO (5562)
F1DO Creative Commons License 2016.07.14 -1 0 5562

Így lefut (korrelációs update) 

 

update table B
set
( B.id,
B.adat
) = (SELECT DISTINCT
max(A.id),
max(A.adat)

FROM table A

WHERE A.id = B.id
AND A.adat is not null

GROUP BY A.id,
A.adat
)
WHERE (B.id) IN (SELECT A.id
FROM table A
WHERE A.adat is not null
);

 

Szolgáljon tanulságul, kedves egészségetekre! :-)

F1DO Creative Commons License 2016.07.14 -1 0 5561

Így nem fut le, a hiba ugyanaz:

 

update table B
set
( B.id,
B.adat
) = (SELECT DISTINCT
max(A.id),
max(A.adat)

FROM table A,
table B
WHERE A.id = B.id
AND A.adat is not null

GROUP BY A.id,
A.adat
);

brioska Creative Commons License 2016.07.14 0 0 5560

Ha jól értem (B) 1 - n (A)  és (A) -t UPDATE-eled, akkor nem szabadna ilyen hibát kapnod, mivel (B)-ben csak egyet találsz hozzá.

 

Egyébként ha tényleg többes kapcsolatból szeretnél, mert nincs egyértelmű kapcsolat, akkor próbáld pl MIN/MAX függvényt.

Előzmény: F1DO (5558)
NevemTeve Creative Commons License 2016.07.13 0 1 5559

Szerintem eke, traktor és konyhasó lenne most jó.

Előzmény: F1DO (5558)
F1DO Creative Commons License 2016.07.13 -1 0 5558

Sziasztok,

 

egy újabb kérdés (elakadás) amire hátha van jó meglátásotok...

 

UPDATE-elés, 'A' tábla id-ja = 'B' tábla id-jával.

Ugyanakkor 'A' táblában több rekord van ugyanazon id-ra mint 'B' táblára. 

 

'B' tábla adataival kellene 'A' tábla rekordjait updatelni, ahol A.id = B.id

Nem fut le az update: ORA-01427 - 'egysoros allekérdezés egynél több sorral tér vissza' hibával.

 

Mégis hogy lehetne 'megerőszakolni' a dolgot és beupdateltetni az 1:N kulcsolású táblánál az oszlopokat?

 

 

F1DO Creative Commons License 2016.07.06 0 0 5557

Köszönöm, igen, visszamenőleg visszaírva - updatelve a forrás adatokat sikerült, és jó is lett..

Előzmény: brioska (5556)
brioska Creative Commons License 2016.07.05 0 0 5556

Sikerült végül?

 

Ha nem, akkor tényleg jó lenne egy példa :)

 

 

 

Előzmény: F1DO (5554)
Gracioso Creative Commons License 2016.06.30 0 0 5555

Ha jól értem, akkor valami ilyesmire gondolsz. Nem túl szép megoldás a manuális oszlophozzáadások miatt, de elvileg működik, 4 sort, hárommá alakít, forrásmegjelöléssel:

 

create table FirstTable (Id int, First01 varchar(20), First02 varchar(20))
create table SecondTable (Id int, Second01 varchar(20), Second02 varchar(20))

insert into FirstTable values (1, 'Alma', 'Korte')
insert into FirstTable values (2, 'Szilva', 'Banan')


insert into SecondTable values (1, 'Zsiraf', 'Majom')
insert into SecondTable values (3, 'Pingvin', 'Hal')

select Id, max(First01), max(First02), max(Second01), max(Second02), max(FirstSource), max(SecondSource) from (

 

select Id, FirstTable.First01, FirstTable.First02, null as Second01, null as Second02, '1' as FirstSource, '0' as SecondSource from FirstTable

 

union

 

select Id, null as First01, null as First02, Second01, Second02, '0' as FirstSource, '1' as SecondSource from SecondTable) tbl group by Id

 

1    Alma    Korte    Zsiraf    Majom    1    1
2    Szilva    Banan    NULL    NULL    1    0
3    NULL    NULL    Pingvin    Hal    0    1

Előzmény: F1DO (5554)
F1DO Creative Commons License 2016.06.29 0 0 5554

Köszi a segítő szándékot, elvileg ahogy utóbb leírtam, egy külön összesítő táblát létrehozva, majd 2 lépésben a leírásnak megfelelően beinsertálva és updatelve az adatokat úgy gondolom megoldható a dolog. 

ha mégsem akkor jelentkezem.. :-)

 

 

Előzmény: halaloszto (5553)
halaloszto Creative Commons License 2016.06.29 0 0 5553

muszáj írj egy példát hogy hogyan néz ki az eredmény. még azt sem látom hány oszolopa van.

 

Előzmény: F1DO (5552)
F1DO Creative Commons License 2016.06.29 0 0 5552



Az adott id-ra minden táblában létezik legalább 1 rekord.
van amelyikben 10 rekord van hozzá, van amelyikben pl 3.

Az oszlopszerkezet ugye eltér.

Ahol az adott id-ra és az adott (ezen táblához tartozó) oszlop szerkezetre lejön 10 rekord, ott ebből lejön mind a 10, mindegyik 1x, és a másik táblából amiben csak pl 3 rekord van az id-hoz ott meg nem határozottan ismétlődven lejön a 3 rekord.
ez alapján végeredményben mindenhol minden oszlopban lesz adat.
Ebben a konkrét példa esetben azt kellene megjeleníteni az adott id-hoz összesen tartozó 10 rekordon, hogy a 10, egyedi rekordot tartalmazó táblából származik adat, ergo ennek a táblának a neve szerepel egy 'adatforrás' oszlopban

és így tovább a többi esetekben.


ebből eredően persze hogy mindenhol ki lesz töltve mindegyik rowid... hiszen ismétlődik még ott is ahol nincs adat eredetileg.. ott be fogja húzni az ismétlődő rowid-t..

 

 

Logikai bukfencnek tűnik a dolog, - legalábbis 1 menetben nem oldható meg..

Először is a 3 táblát összesítő táblában külön táblánként insertálni kell a rekordokat, és ahol amelyik oszlopra nem lesz adat a táblából az üresen marad - így egyben egyértelműen megmondható hogy mely táblából származik az adott rekord. Majd 2. lépésben az üresen maradt oszlopokat updateljük, és így kitöltötté válik a tábla - az eredeti rekord származás mutatása mellett.

NevemTeve Creative Commons License 2016.06.29 0 0 5551

Ja és a rekord honnan származik részt sem értem, sajnos. Ha mondjuk ilyen lekérdezésem van:

 

SELECT e.empno,d.deptno FROM emp e, dept d

WHERE e.deptno=d.deptno;

 

akkor mit értesz azon, hogy melyik rekord honnan származik?

NevemTeve Creative Commons License 2016.06.29 0 0 5550

> A táblákban ugyanazon ID-ra/kulcs-ra eltérő a rekord darabszám.

 

Nagyon félek, hogy ez azt jelenti, amit gondolok, hogy jelent... vagyis hogy az a dolog, amit kulcsnak nevezel, az nem kulcs.

Előzmény: F1DO (5549)
F1DO Creative Commons License 2016.06.29 0 0 5549

Sziasztok,

 

elakadtam egy problémában, hátha útba tudnátok igazítani, bár nem lesz egyszerű vázolni miről is lenne szó..

 

A feladat:

Adott 3 tábla - a közös kulcsot kivéve 3 különféle oszlop / adat tartalommal.

 

A táblákban ugyanazon ID-ra/kulcs-ra eltérő a rekord darabszám.

 

A 3 tábla összes oszlopát vízszintesen 'kiterítve' egyszerre meg kell jeleníteni és minden tábla minden rekordja le kell jöjjön a query eredményében.

 

Ebből eredően - mivel ugyanazon id-ra a a táblákból eltérő darabszámú  rekord jön le - ahol amelyik táblában az adott oszlopra nincs adat, ott ismétlődően jelenítse meg az adott kulcshoz tartozó rekordjait. (left join)

Mindemellett egy külön oszlopban legyen feltüntetve, hogy az adott rekord EREDETILEG melyik táblából származik! (rowid alapján?)

 

Ha alapból lehívom a rowid-kat azok a left join miatt ugyanúgy minden rekordon lejönnek és nem tudom hogyan, milyen eljárásban lehetne beazonosítani származásukat (hiszen mindenhol minden rowid lejön...)

brioska Creative Commons License 2016.03.03 0 0 5548

10.2.0.1.0 -es DB

Előzmény: brioska (5547)

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