Relacja wiele do wielu
TButton - 29-09-2007 00:00
Czy można to zrobić jakoś sprytniej ? Chodzi mi o przedstawienie zależności pomiędzy Nazwiskami a Imionami.
Rozwiązanie oparte na dodaniu do jednej z tabeli tylu kolumn ile jest wierszy w drugiej tabeli odrzucamy :D
Tabele:
NAZWISKA -------- ID integer not null primary key NAZWISKO Varchar(200)
IMIONA -------- ID integer not null primary key IMIE varchar(200)
NAZWISKA_IMIONA ---------------- FK_IMIE integer FK_NAZW integer ILOŚĆ integer
Sposób prezentacji : | Adamowicz | Bryndal | Cedrak | .......|Zytek -------------|---------------------------------------- Ala | 23 | 21 | 34 | | 333 Anastazja | 123 | 121 | 1233 | | 32 Brodka Celina ... ...
SELECT IMIE, (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW= 1) AS Adamowicz, (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW= 2) AS Bryndal ....
FROM IMIONA I ORDER BY IMIE
=?ISO-8859-2?Q?Cezary_Gr=B1dys?= - 29-09-2007 00:00
TButton napisał(a):
> > Sposób prezentacji : > | Adamowicz | Bryndal | Cedrak | .......|Zytek > -------------|---------------------------------------- > Ala | 23 | 21 | 34 | | 333 > Anastazja | 123 | 121 | 1233 | | 32 > Brodka > Celina > ... > ... > > > SELECT IMIE, > (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW = 1) > AS Adamowicz, > (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW = 2) > AS Bryndal > ....
Tak to na pewno nie. Piszesz w select 'AS Adamowicz' , a to 'Adamowicz' powinno być raczej zwracane przez zapytanie. Nazwisk może być tysiące. Może lepiej zrobić taki format:
Ala | Adamowicz | 23 Ala | Bryndal | 21 ......
A potem to sformatować perlem czy jakoś inaczej.
Pozdrawiam
--
Cezary Grądys <czarek.gradys@cartalia.com>
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-09-2007 00:00
TButton wrote: > Czy można to zrobić jakoś sprytniej ? > Chodzi mi o przedstawienie zależności pomiędzy Nazwiskami a Imionami. > > Rozwiązanie oparte na dodaniu do jednej z tabeli tylu kolumn ile jest > wierszy w drugiej tabeli odrzucamy :D > > Tabele: > > NAZWISKA > -------- > ID integer not null primary key > NAZWISKO Varchar(200) > > > IMIONA > -------- > ID integer not null primary key > IMIE varchar(200) > > > NAZWISKA_IMIONA > ---------------- > FK_IMIE integer > FK_NAZW integer > ILOŚĆ integer > > > Sposób prezentacji : > | Adamowicz | Bryndal | Cedrak | .......|Zytek > -------------|---------------------------------------- > Ala | 23 | 21 | 34 | | 333 > Anastazja | 123 | 121 | 1233 | | 32 > Brodka > Celina > ... > ... > > > SELECT IMIE, > (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW = 1) > AS Adamowicz, > (select ILOŚĆ FROM NAZWISKA_IMIONA WHERE FK_IMIE = I.ID AND FK_NAZW = 2) > AS Bryndal > .... > > FROM IMIONA I > ORDER BY IMIE
To zależy od bazy, ale w większości to jest jedyny sposób. Polecam jedna takie zapytanie generować procedurą, po co się męczyć. :)
-- P.M.
Wiktor Zychla - 29-09-2007 00:00
> Czy można to zrobić jakoś sprytniej ?
tak, wykorzystać jakąkolwiek bazę analityczną OLAP (w ostateczności może być kostka statyczna) i zadać do niej zapytanie w języku MDX:
select NAZWISKA.NAZWISKO on ROWS, IMIONA.IMIE on COLUMNS FROM kostka WHERE ILOSC;
gdzie Nazwiska i Imiona to wymiary a Ilosc to miara.
dalej już radź sobie sam.
Wiktor Zychla
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?iso-8859-2?q?Relacje_uwzgl=EAdniaj=B1ce_czas_(jak=3F)?=
=?iso-8859-2?q?Jak_si=EA_robi_insert_do_tabel_z_relacj=B1_1:1 ?=
[MySQL] Jak wybrac wiele elementow powiazanych z jednym elementem innej tablicy?
Lista =?ISO-8859-2?Q?uporz=B1dkowana?= w relacji
[MySQL 4.1] relacja 1:n jako tekst oddzielony przecinkami
Czy stosuje sie relacje bez wymuszania wiezow integralnosci?
[TEORIA BD] Wyznaczanie kluczy relacji .
[MySql] pytanie o relacje, JOIN
[MS sql2005] relacje - problem
=?ISO-8859-2?Q?narz=EAdzie_-_poprawki_typo?=
zanotowane.pldoc.pisz.plpdf.pisz.plnocnerozmowy.xlx.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 |
|