ďťż
 
[ORACLE]Zapytanie o "osierocone rekordy" ďťż
 
[ORACLE]Zapytanie o "osierocone rekordy"
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • czterowers.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com