Andrzej Z.

Andrzej Z. Sky's the limit

Temat: Porównywanie tekstu w SQL

Mam kłopot w odpytaniu w SQLu bazy z OpenOffice.

Tabela:
Mam tabele gdzie kolumny w najłatwiejszy sposób można porównać do następujących zależności rodzinnych. Osoba b jest ojcem a, ojcem b jest c, ojcem c jest d itd.. (idzie dalej tak jak pokolenia, a wszystkie pokolenia są w jednej tabeli). Przy czym ojciec a może mieć kilkoro synów b nazwijmy ich b1-bn. Takie zastrzeżenie zależności dotyczy też i b,c i d. Każda osoba ma swóje rekordy:
Imię,Ojciec

Kwarenda:
Piszę ją w SQL wprost w OpenOffice Base. Celem kwarendy jest wylistowanie wszystkich "potomków" osoby w lini prostej od d do a i w drugą stronę, wylistowanie "ojców" we wszystkich pokoleniach osoby a.

-----------------a-------------------
| |
b1 b2
---------------------- ----------------------
| | | | | |
c1 c2 c3 c4 c5 c6

Pierwszy problem jaki spotkałem to jak porównać dwa teksty?
Zapytanie jakie napisałem na początku zadziałało tylko w przypadku gdy osoba a miała na imię jak osoba b. Bzdura. Nie mam koncepcji jak wyszukać wsród imion w kolumnie Imię to które w innym rekordzie było w kolumnie Ojciec rekordu należącego do innego Imienia i potem to zapętlić bo defakto do tego dążę.

Strasznie namieszałem, mam nadzieje że nie za bardzo. Będę wdzięczny za pomoc.

Andrzej

konto usunięte

Temat: Porównywanie tekstu w SQL

Andrzej Z.:
Mam kłopot w odpytaniu w SQLu bazy z OpenOffice.

Tabela:
Mam tabele gdzie kolumny w najłatwiejszy sposób można porównać do następujących zależności rodzinnych. Osoba b jest ojcem a, ojcem b jest c, ojcem c jest d itd.. (idzie dalej tak jak pokolenia, a wszystkie pokolenia są w jednej tabeli). Przy czym ojciec a może mieć kilkoro synów b nazwijmy ich b1-bn. Takie zastrzeżenie zależności dotyczy też i b,c i d. Każda osoba ma swóje rekordy:
Imię,Ojciec

Kwarenda:
Piszę ją w SQL wprost w OpenOffice Base. Celem kwarendy jest wylistowanie wszystkich "potomków" osoby w lini prostej od d do a i w drugą stronę, wylistowanie "ojców" we wszystkich pokoleniach osoby a.

-----------------a-------------------
| |
b1 b2
---------------------- ----------------------
| | | | | |
c1 c2 c3 c4 c5 c6

Pierwszy problem jaki spotkałem to jak porównać dwa teksty?
Zapytanie jakie napisałem na początku zadziałało tylko w przypadku gdy osoba a miała na imię jak osoba b. Bzdura. Nie mam koncepcji jak wyszukać wsród imion w kolumnie Imię to które w innym rekordzie było w kolumnie Ojciec rekordu należącego do innego Imienia i potem to zapętlić bo defakto do tego dążę.

Strasznie namieszałem, mam nadzieje że nie za bardzo. Będę wdzięczny za pomoc.

Andrzej
Fakt trochę namieszane:)
1. Nie rozumiem do czego ma tutaj służyć porównywanie tekstu? Czy relacje ojciec-syn definiowane są poprzez nazwy? Nie ma żadnego klucza łączącego?
2. Generalnie do takich celów służą struktury drzewiaste w SQL. Mogę Ci napisać pełne zapytanie, ale muszę znać strukturę bazy. Nie ma żadnego klucza typu "ojciec_id" , tak by każdy syn miał pole wskazujące na konkretnego ojca?
Jeśli możesz, to przedstaw płaską strukturę tabeli a na pewno znajdziemy jakieś rozwiązanie.
Andrzej Z.

Andrzej Z. Sky's the limit

Temat: Porównywanie tekstu w SQL

Nie ma innego klucza łączącego. Zakładam że ojciec może mieć tylko jednego syna o danym imieniu. A nie zdaża sie aby na innym poziomie bazy (pokolenia) zestawienie imię-ojciec się powtarzało, więc imię z zestawieniem ojca jest unikalne. Dlatego było mi potrzebne potównanie tekstu.
Nie ma żadnego klucza typu "ojciec_id" , tak by każdy syn miał pole wskazujące na konkretnego ojca?
w sumie jest to dobry pomysł musiałbym zmienić nieco formularz wprowadzania danych i byłoby OK....
... hym chyba nie do końca ... bo może się zdażyć (napewno sie zadaży) że syn będzie wprowadzany przed ojcem, czyli zanim ID_ojca będzie utworzone. Pozatym zawsze osoba na końcu łańcucha ma pole ojciec puste.

Struktura tabeli jest banalna - Imię, Nazwisko, Ojciec, data urodzenia ..., około 180 rekordów z różnymi nazwiskami bo jest kilka osób chronologicznie najstarszych ergo jest kilkadziesiąt nazwisk.

Cel zapytania:Grupowanie rodziny dowolnej chronologicznie osoby z bazy. Zarówno chronologicznie tej przed nią jak i za nią

Tak jest jak się ma 9 lat przerwy w SQLu (nawet już o tym nie pisze w CV :D) a potem się chlapnie gdzieś że się umiało a najgorsze jak się czegoś podejmie. Taki mały refresh na siłę :D

Czy te struktury drzewiaste są obsługiwane w OpenOffice?

Z góry dzięki za pomoc,

AndrzejAndrzej Z. edytował(a) ten post dnia 18.10.10 o godzinie 21:01

konto usunięte

Temat: Porównywanie tekstu w SQL

Dobra to jedziemy.
1. Przerób proszę tą tabelę w taki sposób by posiadała kolumny:

Imię, Nazwisko, Ojciec, data urodzenia, osoba_id (klucz główny tabeli), ojciec_id (może pozostać pusty do czasu kiedy pojawi się ojciec - będzie można wtedy uzupełnić to pole w rekordzie syna).
Zapytanie które wyciągnie Ci drzewko genealogiczne będzie wyglądało tak:

select lpad(' ',4*level)||Imię||' '||'Nazwisko', level, (jakieś tam inne kolumny do wyświetlenia)
from tabelka
start with ojciec_id is null
connect by prior osoba_id=ojciec_id

Poprawcie mnie proszę jeśli się mylę (trzecie piwko sączę więc istnieje takie prawdopodobieństwo :) )
To jest SQL w wydaniu Oracle
O co c'mon - lpad dodaje nam w tym przypadku spacje do długości 4 krotnie dłuższej niż poziom zagnieżdżenia rekordu w strukturze drzewiastej. Dzięki konkatenacji Imię i nazwisko jest odsunięte dalej lub bliżej od lewej krawędzi w zależności od poziomu zagnieżdżenia. Dzięki temu powstaje swoiste drzewko.
Level wyświetla poziom zagnieżdżenia w strukturze.
Zaczynamy (start with) od tych wierszy które reprezentują najdalszego przodka (czyli nie mamy informacji o jego ojcu)
następnie łączymy (connect by ) wiersze w taki sposób, by ojciec_id wskazywało na osoba_id innego wiersza w relacji syn-ojciec. Powstaje nam ładne drzewko.
Podaję tutaj rozwiązanie dla ORacle - same struktury drzewiaste prawdopodobnie występują też w tej bazie z której korzystasz (nie wiem - na oczy tego nie widziałem). Co do lpad i level na pewno znajdą się jakieś odpowiedniki, o ile nie ma tam funkcji o tej samej nazwie.

JBC to pisz jeszcze, jutro wieczorem będę miał chwilę to mogę do tego przysiąść.
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Porównywanie tekstu w SQL

A ja znalazłem coś takiego w googlu
http://sheepdogguides.com/fdb/fdb7FamTree.htm

konto usunięte

Temat: Porównywanie tekstu w SQL

hej,
klasyczny przykład zapytań hierarchicznych :)
problem w tym ze normalnie sql nie wspiera struktur drzewiastych -
owszem są twory w oraclu jak connect by ( ale nie polecam )
albo w postgresie moduł rozszerzający o nazwie l tree.

Taka strukture nalezy rozszerzyc o dwa pola
l_tree i r_tree ( oba sa intami ) - ich wartosci odpowiadaja odpowiednio odliczeniu w lewo po drzewie czyli jak mamy :
1 TATA 6
/ \
/ \
2corka 3 4 corka 5

itd...

nie jest konieczne posiuadanie ID ojca, poniewaz mozemy zasymulowac jego pochodzenie poprzez opisanie go wybranymi wartosciami l_tree i r_tree.

WAZNE!

W takim zapytaniu dane pobiera sie klazura between, czyli pomiedzy w ten sposob mozemy wyciagnac cale drzewo - z dowolnego node'a i dowolna glebokosc.
bez stosowania cudnych rzeczy jak connect by, czy hardcodowania poziomu zaglebienia itp...

minusem tego rozwiazania : podczas dodawania rekordow czy aktualizacji - wymagany jest bezwzgledny LOCK na tabeli - poniewaz w memencie aktualizacji - czyli przelicznia ( odliczania ) l_tree i r_tree jak ktos nam usunie albo doda cos to caly nasz schemat pojdzie do piachu ... : ) - cos za cos..
ale jak ma byc 180 rekordow to zapytanie takie pojdzie blyskawicznie.

PS: rozwiazanie to jest do zaimplementowania w kazdym RDBMS.

ŁŁukasz Grabowski edytował(a) ten post dnia 18.10.10 o godzinie 22:16
Marcin Bronicki

Marcin Bronicki kierownik, własna

Temat: Porównywanie tekstu w SQL

Łukasz Grabowski:
hej,
klasyczny przykład zapytań hierarchicznych :)
problem w tym ze normalnie sql nie wspiera struktur drzewiastych -
a mdx?

konto usunięte

Temat: Porównywanie tekstu w SQL

MDX do zupełnie czego innego służy. Klauzule takie jak "Connect by" w Oraclu sa jak najbardziej polecane i nie rozumiem dlaczego je odradzasz...

konto usunięte

Temat: Porównywanie tekstu w SQL

hehe, bo nie każdy ma oracla...

PS : ozywać do takich rzeczy oracla to tak jak kombajnem na rzeżuchę w doniczce : )Łukasz Grabowski edytował(a) ten post dnia 18.10.10 o godzinie 22:26

konto usunięte

Temat: Porównywanie tekstu w SQL

Łukasz Grabowski:
hehe, bo nie każdy ma oracla...

PS : ozywać do takich rzeczy oracla to tak jak kombajnem na rzeżuchę w doniczce : )Łukasz Grabowski edytował(a) ten post dnia 18.10.10 o godzinie 22:26
Nie mówię żeby ożywiać Oracle, ale by znaleźć analogię. Jak już mówiłem - nie znam tej konkretnej Open Office'owej bazy.
Na pewno zmiana struktury tabeli byłaby dobrym posunięciem, bo w obecnym kształcie to trochę rzeźbienie w g..... :)

konto usunięte

Temat: Porównywanie tekstu w SQL

Andrzej K.:
Łukasz Grabowski:
hehe, bo nie każdy ma oracla...

PS : ozywać do takich rzeczy oracla to tak jak kombajnem na rzeżuchę w doniczce : )
Nie mówię żeby ożywiać Oracle, ale by znaleźć analogię. Jak już mówiłem - nie znam tej konkretnej Open Office'owej bazy.
Na pewno zmiana struktury tabeli byłaby dobrym posunięciem, bo w obecnym kształcie to trochę rzeźbienie w g..... :)

hehheh masz mnie na ślepym wykorzystaniu podpowiedzi w przeglądarce : )
owsze, miałęm na myśli używać ;D

tak analogie rozumiem, ale ja jestem wyznawcą KISS i przenośności - niestety nie zawsze udaję się znaleźć funkcję doWhatEverIWillThink() :)

I tak zmiana struktury tabeli przyda się....Łukasz Grabowski edytował(a) ten post dnia 18.10.10 o godzinie 23:11
Andrzej Z.

Andrzej Z. Sky's the limit

Temat: Porównywanie tekstu w SQL

Łukasz Grabowski:
PS : ozywać do takich rzeczy oracla to tak jak kombajnem na rzeżuchę w doniczce : )

:D takie miałem właśnie przeczucie. Mam jakiegoś tam oracla z czasów kiedy jeszcze się w to bawiłem, ale coś mi on do tego nie pasował. Trafne porównanie, na obecnym etapie tego co chcę zrobić.

Łukasz, nie bardzo złapałem ten pomysł z i-tree i r-tree to dodatkowe kolumny? Sorki za głupie pytania ale nie jestem od lat nawet z zamiłowania informatykiem. A ostatniej bazie danych jaką próbowałem zarządzać odłączyli prąd w 2002 (kurs miałem jeszcze wcześniej w dodatku dedykowany dla Oracle Spatial edycja 9i)

Andrzej

konto usunięte

Temat: Porównywanie tekstu w SQL

hej,

tak to są dodatkowe kolumny, których wartości są ustalane według odliczania w lewą stronę ( dookoła drzewa ).
I wyciągasz to co chcesz za pomocą between'a.
masz dziadka i do syna, znasz id dziadka i syna i wyciągacza wszystko between dziadek l_tree a syn ( poprzez ojca oczywiście ) r_tree.

jak chcesz dalej, to mierzysz max(l_tree) itd.

nie mam daru przekazywania wiedzy w opisach, mam nadzieje że jaśniej.
Btw oracla nie potrzebujesz, starczy najprostsza relacyjna wspierająca between ( czyt. każda )

ŁŁukasz Grabowski edytował(a) ten post dnia 20.10.10 o godzinie 21:41
Piotr Jan Podleśny

Piotr Jan Podleśny wszystko jest
trudne, dopóki nie
stanie się proste...

Temat: Porównywanie tekstu w SQL

witam,

tak naprawdę to ma być drzewo genealogiczne?
czy może drzewiasta struktura produktu?

W pierwszym rozwiązanie będzie inne, bo dziecko na tylko jedną matkę i ojca.
Natomiast w drugim kawałek struktury drzewiastej może występować w wielu poziomach jakiś różnych produktów.



Wyślij zaproszenie do