Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem SQL - prepojenie tabuliek

Zdravím, potrebovala by som pomôcť pri prepájaní tabuliek.
Mám tabuľky vyrobca, liek a diagnoza, ktore spajam v tabuľke info. Problém je, že niektorý výrobca lieky nemá alebo nie na všetky diagnózy sú lieky, a tak je tam hodnota NULL. Tá tam však byť nemôže, keďže je to primary key. Neviete mi niekto poradiť ako to mám vyriešiť?
Ďakujem.

Předmět Autor Datum
Co znamená, že je spojuješ v tabulce info?
Wikan 20.04.2013 17:13
Wikan
Znamená to, že mám kvázi 3 nezávislé tabuľky, ktoré potrebujem prepojiť .. a prepájam to tak, že v k…
k3 20.04.2013 17:17
k3
Ale to propojení nemáš mít v nějaké tabulce. Propojení definuješ pomocí klíčů.
Wikan 20.04.2013 17:20
Wikan
Nás učia, že to máme mať v tabuľke, ja iné riešenie neviem.. ale rada sa dozviem o inom.
k3 20.04.2013 17:22
k3
Tak to jsi to buď špatně pochopila a nebo spíš špatně píšeš, čeho chceš vlastně dosáhnout.
Wikan 20.04.2013 17:23
Wikan
Nás učia robiť všetko ako je to v tejto fyzickej schéme autoservisu. Sú tam 3 tabuľky, prepojené v j…
k3 20.04.2013 17:33
k3
Ale tam ta třetí tabulka nese nějakou informaci. Jakou informaci nese ta tvoje tabulka info?
Wikan 20.04.2013 17:39
Wikan
Pôvodne niesla.. ale už nenesie. Takže v podstate by som to mohla spraviť tak, že v tabuľke DIAGNOZ…
k3 20.04.2013 17:42
k3
Ne. Budeš mít tabulky Vyrobce, Lek, Diagnoza a spojovací tabulku LeciDiagnozu, která ti rozloží vzta…
Wikan 20.04.2013 17:47
Wikan
Takže v tabuľke DIAGNOZA bude id_diagnozy ako primary a id_lieku ako primary key? V LIECI_DIAG bude…
k3 20.04.2013 17:54
k3
Ne. Diagnoza bude mít pouze primární klíč, Lék bude mít primární klíč a cizí klíč na tabulku Výrobce…
Wikan 20.04.2013 17:57
Wikan
Takže si píšem DIAGNOZA: id_diagnoza <pk> LIEK: id_lieku <pk> id_vyrobcu <fk> LIECI_DIAG: id_diagnoz…
k3 20.04.2013 18:03
k3
Ano.
Wikan 20.04.2013 18:04
Wikan
Dobre, problém som vyriešila, ale rozhasilo mi to celú tabuľku. Kde bude zadávať teraz názov diagnóz…
k3 20.04.2013 18:07
k3
Název diagnózy logicky do tabulky Diagnozna. Jaký asi může mít výrobce a lék vztah? Výrobce vyrábí l… poslední
Wikan 20.04.2013 19:23
Wikan
Aká je štruktúra tabuliek, ako vyzerá Tvoj SQL dopyt?
pme 20.04.2013 17:14
pme
Šlo by sem vložit strukturu tabulek a jakým SELECTem vybíráš data? SQL je konkrétně jaký? MySQL, MS…
host 20.04.2013 17:15
host
Dáta len vkladám, nevyberám. SQL je najzákladnejší aký môže byť.
k3 20.04.2013 17:19
k3
Tak teda bohužel ani jedné tvé odpovědi nerozumím. Co je nejzákladnější SQL? Snad má ta databáze něj…
host 20.04.2013 17:22
host
SQLplus Každý stĺpec v tom .pdf je u mňa samostatná tabuľka.. a ja z toho robím tie riadky.. či ani…
k3 20.04.2013 17:35
k3
Konkrétne toto potrebujem spraviť.
k3 20.04.2013 17:19
k3
A zatiaľ mám: create table krajina( krajina_povodu number(1) primary key, nazov_krajiny varchar2(15…
k3 20.04.2013 17:20
k3
pokud spojuješ tabulky na sloupci, kde na nějaké straně je hodnota NULL a ty ten řádek chceš pak máš…
AZOR 20.04.2013 17:26
AZOR

Tak teda bohužel ani jedné tvé odpovědi nerozumím.
Co je nejzákladnější SQL? Snad má ta databáze nějaký název, ne? Syntaxe jednotlivých DB se totiž liší.

Když jen vkládáš data, není mi jasné, jak je "spojuješ" v tabulce info. Data by se měla vkládat do samostatných tabulek (vyrobca, liek a diagnoza), tzv. číselníky a potom data vybereš (spojíš) SELECTem.

A zatiaľ mám:

create table krajina(
krajina_povodu number(1) primary key,
nazov_krajiny varchar2(15)
);

create sequence s_krajina_povodu increment by 1 start with 1;

create table vyrobca(
kod_vyrobcu varchar2(10) primary key,
id_vyrobcu number(1),
spolocnost varchar2(45) not null,
krajina_povodu number(1) default 1,
adresa varchar2(25) not null,
foreign key (krajina_povodu) references krajina(krajina_povodu),
foreign key (adresa) references distributor(adresa)
);

create table distributor(
adresa varchar2(25) primary key,
psc char(10) not null,
mesto varchar2(20) not null
);

create table info(	
kod_vyrobcu varchar2(10),
kod_lieku char(3),
kod_diagnozy char(3), 
primary key (kod_vyrobcu, kod_lieku, kod_diagnozy),
foreign key (kod_vyrobcu)  references vyrobca(kod_vyrobcu), 
foreign key (kod_lieku) references liek(kod_lieku),
foreign key (kod_diagnozy) references diagnoza(kod_diagnozy)
);

create table liek(
kod_lieku char(3) primary key,
id_lieku number(1),
nazov_lieku varchar2(15) not null,
cena number(4,2) not null,
datum_vyroby date default sysdate,
expiracia date,
liecivo varchar2(20) not null,
check(expiracia>datum_vyroby),
check(cena>0)
);

create table diagnoza(
kod_diagnozy char(3) primary key,
id_diagnozy number(2),
diagnoza varchar2(40)not null
);

create sequence s_id_l increment by 1 start with 1;
create sequence s_id_d increment by 1 start with 1;
create sequence s_id_v increment by 1 start with 1;

insert into krajina values(s_krajina_povodu.nextval, 'Slovensko');
insert into krajina values(s_krajina_povodu.nextval, 'Ceska republika');
insert into krajina values(s_krajina_povodu.nextval, 'Slovinsko');
insert into krajina values(s_krajina_povodu.nextval, 'Velka Britania');
insert into krajina values(s_krajina_povodu.nextval, 'Dansko');

insert into vyrobca values('ZNT-1', s_id_v.nextval, 'Zentiva a.s.', 2, 'Einsteinova 24'); 
insert into vyrobca values('SAN-SLO-1', s_id_v.nextval, 'Sandoz Pharmaceuticals d.d.', 3, 'Galvaniho 15/C'); 
insert into vyrobca values('PFI-DB-3', s_id_v.nextval, 'Pfizer Europe MA EEIG', 4, 'Ramsgate Road. Sandwich');
insert into vyrobca values('GLA', s_id_v.nextval, 'Glaxo Group Ltd.', 4, 'Galvaniho 7/A');
insert into vyrobca values('IVX', s_id_v.nextval, 'IVAX Pharmaceuticals s.r.o.', 2, 'Ostravska 291/33');
insert into vyrobca values('BOE', s_id_v.nextval, 'Boehringer Ingelheim International GmbH.', 5, 'Binger Strasse 173');


insert into distributor values('Einsteinova 24', '85101', 'Bratislava');
insert into distributor values('Galvaniho 15/C', '82104', 'Bratislava');
insert into distributor values('Ramsgate Road. Sandwich', 'CT13 9NJ', 'Kent');
insert into distributor values('Galvaniho 7/A', '82104', 'Bratislava');
insert into distributor values('Ostravska 291/33', '74770', 'Opava - Komarov');
insert into distributor values('Binger Strasse 173', '55216', 'Ingelheim am Rhein');

insert into liek values('IBA', s_id_l.nextval,'Ibalgin400','2,40', to_date ('23.2.2010','DD.MM.YYYY'), to_date ('23.2.2012','DD.MM.YYYY'), 'analgetikum');
insert into liek values('SEP', s_id_l.nextval, 'Septisan', '3,80', to_date ('12.12.2010','DD.MM.YYYY'), to_date ('12.12.2012','DD.MM.YYYY'), 'otorinolaringologika');
insert into liek values('LOZ', s_id_l.nextval, 'LOZAP 50', '23,20', to_date ('13.1.2011','DD.MM.YYYY'), to_date ('13.1.2013','DD.MM.YYYY'), 'hypotanziva');
insert into liek values('DIT', s_id_l.nextval, 'Dithiaden', '3,20', to_date ('12.5.2010','DD.MM.YYYY'), to_date ('12.5.2013','DD.MM.YYYY'), 'antihistaminika');
insert into liek values('FLO', s_id_l.nextval, 'Flonidan', '2,10', to_date ('30.7.2010','DD.MM.YYYY'), to_date ('30.7.2012','DD.MM.YYYY'), 'antihistaminika');
insert into liek values('KOR', s_id_l.nextval, 'Kornam 10mg', '21,10', to_date ('5.8.2010','DD.MM.YYYY'), to_date ('5.8.2012','DD.MM.YYYY'), 'hypotenziva');
insert into liek values('OME', s_id_l.nextval, 'Omeprazol 20mg', '15,80', to_date ('3.10.2009','DD.MM.YYYY'), to_date ('3.10.2011','DD.MM.YYYY'), 'antacida');


insert into diagnoza values('BOL', s_id_d.nextval, 'bolest');
insert into diagnoza values('HOR', s_id_d.nextval, 'horucka');
insert into diagnoza values('ZHD', s_id_d.nextval, 'zapal hornych dychacich ciest');
insert into diagnoza values('ZUD', s_id_d.nextval, 'zapal ustnej dutiny');
insert into diagnoza values('VKT', s_id_d.nextval, 'vysoky krvny tlak');
insert into diagnoza values('ALE', s_id_d.nextval, 'alergia');
insert into diagnoza values('ZSP', s_id_d.nextval, 'zapal spojiviek');
insert into diagnoza values('VRD', s_id_d.nextval, 'vredy dvanastnika');
insert into diagnoza values('REZ', s_id_d.nextval, 'refluxna ezofagitida');
insert into diagnoza values('ZES', s_id_d.nextval, 'Zollingerov-Ellisonov syndrom');
insert into diagnoza values('CBO', s_id_d.nextval, 'chronicke bronchopulmonlne ochorenia');
insert into diagnoza values('RUB', s_id_d.nextval, 'rubeola');
insert into diagnoza values('SMX', s_id_d.nextval, 'skleroza multiplex');
insert into diagnoza values('ACH', s_id_d.nextval, 'alzheimerova choroba');



insert into info values('ZNT-1', 'IBA', 'BOL');
insert into info values('ZNT-1', 'IBA', 'HOR');
insert into info values('ZNT-1', 'SEP', 'ZHD');
insert into info values('ZNT-1', 'SEP', 'ZUD');
insert into info values('ZNT-1', 'LOZ', 'VKT');
insert into info values('ZNT-1', 'DIT', 'ALE');
insert into info values('ZNT-1', 'DIT', 'ZSP');
insert into info values('SAN-SLO-1', 'FLO', 'ALE');
insert into info values('SAN-SLO-1', 'FLO', 'ZSP');
insert into info values('SAN-SLO-1', 'KOR', 'VKT');
insert into info values('SAN-SLO-1', 'OME', 'VRD');
insert into info values('SAN-SLO-1', 'OME', 'REZ');
insert into info values('SAN-SLO-1', 'OME', 'ZES');

pokud spojuješ tabulky na sloupci, kde na nějaké straně je hodnota NULL a ty ten řádek chceš pak máš navýběr následující slova a typy spojení:

a left join b on (a.i=a.b) - všecno v áčku, i když to nemá v béčku záznam
a right join b on (a.i=a.b) - všechno v béčku i když to v á nemá záznam
a full outer join b on (a.i=b.i) - všechno z obou tabulek
-- a nebo pro oracle lepší quotace:
select * from a,b where a.i=b.i(+)
select * from a,b where a.i(+)=b.i

a samozřjmě fungují i operátory typu = OR a.i IS NULL.

Musíš použít typ spojení, který dovolí nemít relaci pro obraz řádku v druhé tabulce, a od toho je LEFT, RIGHT join (at již normálním či zkráceným zápisem (+) na oracle)

Zpět do poradny Odpovědět na původní otázku Nahoru