firebird - specyficzne łaczenie tabel

0

Witam,

Muszę połączyć dwie tabele, niby nic szczególnego [diabel]
ale, no właśnie

pierwsza tabela:
id_klucz_pierwszy [primary key]
nazwaskr
[inne dane]

druga tabela:
id_klucz_pierwszy [połączenie wiele do jednego z pierwszej tabeli]
id_klucz_drugi [primary key]
[inne dane]

Pierwsza tabela zawiera podstawowe dane [kontrahenta - skrót nazwy, telefon itp], druga zaś kolejne uzupełnienia tych danych [adres, nip, przedstawiciele itp]

Tabele muszę połączyć w sposób:
z T1 : nazwa skrócona i inne dane
z T2 : dla maks. wartości id_klucz_drugi z grupy id_klucz_pierwszy [czyli najbardziej aktualne dane]

Ten sposób nie działa [glowa]
select k.NAZWASKR, K.ID_KONTRAH, dk.ID_KONTRAH, dk.id_danekontrah, dk.miejscowosc , dk.nip , dk.nazwadl, dk.kodpocztowy
from KONTRAH K
inner join DANEKONTRAH dk
on k.ID_KONTRAH = ANY(SELECT ID_KONTRAH from DANEKONTRAH GROUP by id_kontrah)
order by K.NAZWASKR

PS. to nie mój pomysł z taką bazą, ale muszę z niej korzystać :-[

0

Spróbuj tak:
select k.NAZWASKR, K.ID_KONTRAH, dk.ID_KONTRAH, dk.id_danekontrah, dk.miejscowosc , dk.nip , dk.nazwadl, dk.kodpocztowy
from KONTRAH K
inner join DANEKONTRAH dk
on k.ID_KONTRAH = dk.KONTRAH
order by K.NAZWASKR

0

:>

to byłoby zbyt proste ;-)

fizycznie jest połączenie jeden do wielu, a ma być zasymulowane jeden do jeden
To co podałeś, podaje wszystkie rekordy z drugiej tabeli [czyli z powtórzeniami]
a ma z drugiej tabeli wybrać tylko jedno wystapienie

0

Zrób sobie MAX() po drugim kluczu i pogrupuj po pierwszym. Złącz to jeszcze raz z drugą tabelą (po resztę danych) i złącz z pierwszą po kluczu pierwszej. Od razu mowie ze najwydajniejsze to to nie jest. Może lepiej zrobić trigger'a na drugiej tabeli który w odpowiednim rekordzie pierwszej będie uaktualniał klucz do drugiej (takie pole trzeba by było dodać). Później masz "pure" 1:1 no może 1:0 : )

0
^^b0bik^^ napisał(a)

Zrób sobie MAX() po drugim kluczu i pogrupuj po pierwszym. Złącz to jeszcze raz z drugą tabelą (po resztę danych) i złącz z pierwszą po kluczu pierwszej. Od razu mowie ze najwydajniejsze to to nie jest. Może lepiej zrobić trigger'a na drugiej tabeli który w odpowiednim rekordzie pierwszej będie uaktualniał klucz do drugiej (takie pole trzeba by było dodać). Później masz "pure" 1:1 no może 1:0 : )

Nie mogę dodać pola, baza nie jest "moja" :/
Ja tylko robię dokładkę, która korzysta z kilku tabel tej bazy. Warunek producenta - można dołożyć swoje tabele, ale nie można zmieniać istniejących.

I pytanie dodatkowe:
szukam odpowiednika oraclowego - TO_CHAR(<pole_bazy>, "000 000,00" )

0
piotrekk_k napisał(a)

I pytanie dodatkowe:
szukam odpowiednika oraclowego - TO_CHAR(<pole_bazy>, "000 000,00" )

cast(id as varchar(10)) ale z formatowaniem, to może jakiś CASE i złączenie łańcuchów, ale pewnie da się o wiele prościej.

0

Jeśli to FB i masz wyciągnąć jeden wiersz i dodatkowo zakładasz że o najświeższych danych świadczy wartość PK to napisz tak:

select FIRST 1 k.NAZWASKR, K.ID_KONTRAH, dk.ID_KONTRAH, dk.id_danekontrah, dk.miejscowosc , dk.nip , dk.nazwadl, dk.kodpocztowy
from KONTRAH K
join DANEKONTRAH dk on (k.ID_KONTRAH = dk.ID_KONTRAH)
order by dk.ID_DANEKONTRAH DESC

Dostaniesz pierwszy (czyli tylko 1) wiersz z puli wierszy posortowanych malejąco po ID_DANEKONTRAH czyli dostaniesz wiersz z największą wartością ID_DANEKONTRAH dla danego kontrahenta (czyli według ciebie z najświeższymi danymi kontrahenta)

0
Gość napisał(a)

Jeśli to FB i masz wyciągnąć jeden wiersz i dodatkowo zakładasz że o najświeższych danych świadczy wartość PK to napisz tak:

select FIRST 1 k.NAZWASKR, K.ID_KONTRAH, dk.ID_KONTRAH, dk.id_danekontrah, dk.miejscowosc , dk.nip , dk.nazwadl, dk.kodpocztowy
from KONTRAH K
join DANEKONTRAH dk on (k.ID_KONTRAH = dk.ID_KONTRAH)
order by dk.ID_DANEKONTRAH DESC

Dostaniesz pierwszy (czyli tylko 1) wiersz z puli wierszy posortowanych malejąco po ID_DANEKONTRAH czyli dostaniesz wiersz z największą wartością ID_DANEKONTRAH dla danego kontrahenta (czyli według ciebie z najświeższymi danymi kontrahenta)

Pierwsza tabela zawiera ok 1000 rekordów, druga jakieś 6000.
Muszę powiązać te 1000 rekordów z 1000 rekordów z drugiej tabeli [i wrzucić do grida]
zasada:

tb1.id_kontrah(primary key) = tb2.id_kontrah(for. key) dla max(tb2.id_danekontrah)(primary key)
| tab1 | tab2
| id_k | id_k | id_dk |

| 1 | 1 | 1 | - wyswietlony
| 2 | 2 | 2 | - wyświetlony
| | 3 | 3 | - pominięty
| | 3 | 10 | - pominięty
| 3 | 3 | 25 | - wyswietlony

0

A no skoro chcesz wyciągnąć wszystkich kontrahentów to sprawa żeczywiście wygląda gorzej.
Pierwsze co to baza w taki sposób wydaje się być źle zaprojektowana. :/

Ale czy przypadkiem w tabeli DANEKONTRAH nie ma pola BAZADANEKONTRAH ? ;)
Jeśli jest to wartość 1 w tym polu oznacza aktualne dane i występuje dokładnie raz dla jednego kontrahenta ;] .

0
Gość napisał(a)

A no skoro chcesz wyciągnąć wszystkich kontrahentów to sprawa żeczywiście wygląda gorzej.
Pierwsze co to baza w taki sposób wydaje się być źle zaprojektowana. :/

Ale czy przypadkiem w tabeli DANEKONTRAH nie ma pola BAZADANEKONTRAH ? ;)
Jeśli jest to wartość 1 w tym polu oznacza aktualne dane i występuje dokładnie raz dla jednego kontrahenta ;] .

[rotfl]
Dzięki
widzę, że kolega zna bazy tej firmy ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1