[ORACLE]Zapytanie o "osierocone rekordy"
Hektor - 21-07-2006 01:19
[ORACLE]Zapytanie o "osierocone rekordy"
Przepraszam za lamerskie pytanie ale jak powinno wygladac w miare eleganckie zapytanie w nastepujacej sytuacji:
tabela A (naglówki) tabela B (pozycje) relacja 1->n nastepuje poprzez kolumne nr (A.nr do wielu B.nr)
Pytanie: jak znalezc rekordy B nie przypisane do A (czyli tytulowo "osierocone") ? Rozwiazanie z "select ... minus select ..." znam, czy sa jeszcze jakies inne ? Pytanie 2: jak mogoby wygladac usuniecie tak wyselekcjonowanych rekordów ?
Z góry dziekuje !
-- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 21-07-2006 01:19
Hektor wrote: > Przepraszam za lamerskie pytanie ale jak powinno wygladac w miare > eleganckie zapytanie w nastepujacej sytuacji: > > tabela A (naglówki) > tabela B (pozycje) > relacja 1->n nastepuje poprzez kolumne nr (A.nr do wielu B.nr) > > Pytanie: jak znalezc rekordy B nie przypisane do A (czyli tytulowo > "osierocone") ? Rozwiazanie z "select ... minus select ..." znam, czy sa > jeszcze jakies inne ? > Pytanie 2: jak mogoby wygladac usuniecie tak wyselekcjonowanych rekordów ?
LEFT JOIN (w starych oracle'ach (+) )
lub
NOT EXIST (ale to jest mało wydajne)
-- P.M.
=?ISO-8859-2?Q?Adam_P=B3aszczyca?= - 21-07-2006 01:19
On 20 Jul 2006 17:55:06 +0200, hektor@artnet.pl (Hektor) wrote:
>Przepraszam za lamerskie pytanie ale jak powinno wygladac w miare eleganckie >zapytanie w nastepujacej sytuacji: > >tabela A (naglówki) >tabela B (pozycje) >relacja 1->n nastepuje poprzez kolumne nr (A.nr do wielu B.nr) > >Pytanie: jak znalezc rekordy B nie przypisane do A (czyli tytulowo >"osierocone") ? Rozwiazanie z "select ... minus select ..." znam, czy sa >jeszcze jakies inne ?
Select * from B where B.nr not in (select distinct A.nr from A)
>Pytanie 2: jak mogoby wygladac usuniecie tak wyselekcjonowanych rekordów ?
Zamień 'select *' na 'delete' -- ___________ (R) /_ _______ Adam 'Trzypion' Płaszczyca (+48 502) 122 688 ___/ /_ ___ ul. Ludwiki 1 m. 74, 01-226 Warszawa _______/ /_ http://www.plfoto.com/zdjecie.php?picture=861112 ___________/ mail: _555@irc.pl GG: 3524356
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 21-07-2006 01:19
Paweł Matejski wrote: > NOT EXIST (ale to jest mało wydajne) Jakby było mało wydajne, to by tego nie było w ogóle...
Narzędzia prostu trzeba dobierać do zadania. W zależności od ilości danych w zewnętrznej i wewnętrznej części zapytania NOT EXISTS może być bardzo wydajne, albo bardzo wolne (albo gdzieś między tymi ekstremami).
Polecam lekturę: http://asktom.oracle.com/pls/ask/f?p...D:953229842074
-- Michał Kuratczyk
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 21-07-2006 01:19
Michał Kuratczyk wrote: > Paweł Matejski wrote: >> NOT EXIST (ale to jest mało wydajne) > Jakby było mało wydajne, to by tego nie było w ogóle... > > Narzędzia prostu trzeba dobierać do zadania. W zależności od > ilości danych w zewnętrznej i wewnętrznej części zapytania > NOT EXISTS może być bardzo wydajne, albo bardzo wolne (albo gdzieś > między tymi ekstremami).
Tak, tylko najczęstszy przypadek jest taki, gdy w tabeli podrzędnej jest dużo więcej rekordów niż w nadrzędnej. A w rozwiązaniu zadania jakie ma przedpisca to właśnie tabel podrzędna znajdzie się w części zewnętrznej co jest bardzo niekorzystny przypadek dla EXIST. Do tego EXIST sprawdza się najbardziej, gdy szukana wartość wielokrotnie sie powtarza, a w tym przypadku taka sytuacja nie zachodzi.
> Polecam lekturę: > http://asktom.oracle.com/pls/ask/f?p...D:953229842074
No, ale z tej lektury wynika tylko, że EXIST jest czasami lepsze od IN. :)
-- P.M.
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 22-07-2006 04:32
Paweł Matejski wrote: >>> NOT EXIST (ale to jest mało wydajne) >> Jakby było mało wydajne, to by tego nie było w ogóle... > Tak, tylko najczęstszy przypadek jest taki, gdy w tabeli podrzędnej jest > dużo więcej rekordów niż w nadrzędnej. A w rozwiązaniu zadania jakie ma > przedpisca to właśnie tabel podrzędna znajdzie się w części zewnętrznej > co jest bardzo niekorzystny przypadek dla EXIST. Do tego EXIST sprawdza > się najbardziej, gdy szukana wartość wielokrotnie sie powtarza, a w tym > przypadku taka sytuacja nie zachodzi. To trzeba było napisać "NOT EXISTS (ale w tym wypadku będzie pewnie mało wydajne)" - nie czepiałbym się. :-)
>http://asktom.oracle.com/pls/ask/f?p...D:953229842074 > No, ale z tej lektury wynika tylko, że EXIST jest czasami lepsze od IN. :) Ale jest też opisane jak działa jedno i drugie i kiedy jedno jest lepsze od drugiego. Moim zdaniem warto wiedzieć.
-- Michał Kuratczyk
Marek Horodyski - 22-07-2006 04:33
Użytkownik "Hektor" <hektor@artnet.pl> napisał w wiadomości news:000301c6ac14$d4523ac0$0402a8c0@maxstation... > Przepraszam za lamerskie pytanie ale jak powinno wygladac w miare > eleganckie zapytanie w nastepujacej sytuacji: > > tabela A (naglówki) > tabela B (pozycje) > relacja 1->n nastepuje poprzez kolumne nr (A.nr do wielu B.nr) > > Pytanie: jak znalezc rekordy B nie przypisane do A (czyli tytulowo > "osierocone") ? Rozwiazanie z "select ... minus select ..." znam, czy sa > jeszcze jakies inne ? > Pytanie 2: jak mogoby wygladac usuniecie tak wyselekcjonowanych rekordów ? > > Z góry dziekuje !
Jak Oracle, to najwydajniejsze jest :
select b.id from a, b where a.id(+) = b.id and a.id is null
Pozdrawiam, Marek Horodyski
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
=?iso-8859-2?q?[oracle_10g]_jak_da=E6_grant_do_gv$=2E=2E=2E=2E_=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plczterowers.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|