Forum » Programiranje » SQL pomoč
SQL pomoč
uro10 ::
prozac ::
Ne razumem najbolje:
1. Ali te zanima kako napisat create table letalo, ekipa, prireditve in kako vzpostaviti FK constrainte med temi tremi tabelami?
2. Ali te zanima kako napisati insert stavek za vnos podatkov v tabelo letalo, glede na omejitve s FKji v taisti tabeli letalo? => tuki moras uporabiti nested select znotraj insert stavka
1. Ali te zanima kako napisat create table letalo, ekipa, prireditve in kako vzpostaviti FK constrainte med temi tremi tabelami?
2. Ali te zanima kako napisati insert stavek za vnos podatkov v tabelo letalo, glede na omejitve s FKji v taisti tabeli letalo? => tuki moras uporabiti nested select znotraj insert stavka
Zgodovina sprememb…
- spremenilo: prozac ()
uro10 ::
Zanima me točno to kar si napisal. Kako vzpostaviti FK constrainte med temi tremi tabelami in kako napisati insert stavke glede na tiste FKje.
prozac ::
create table xxx_prireditve (sifra integer, ekipa_sifra varchar2(2), drzava_sifra varchar2(3), ime varchar2(15), stobiskovalcev integer, caszacetka integer, trajanje integer); create unique index xxx_prireditve_pk on xxx_prireditve (sifra); alter table xxx_prireditve add constraint prireditve_pk primary key (sifra) enable validate; create table xxx_letalo (sifra integer, ekipa_sifra varchar2(2), prireditev_drzava_sifra varchar2(3), prireditev_ekipa_sifra varchar2(2), prireditev_sifra integer, ime varchar2(15), stobiskovalcev integer, caszacetka integer, trajanje integer); alter table xxx_letalo add constraint prireditev_sifra_fk foreign key (prireditev_sifra) references xxx_prireditve (sifra);
zgoraj je nakazano samo za FK na eno tabelo
ko delaš insert moraš najprej narediti insert v tabelo prireditve in šele nato v tabelo letalo
lp
Tody ::
Ključi so po svoji sestavi unikatni. Če v tablah, ki jih imaš ne moreš vzpostavit ključev, se naredi še ena tabela vmes, ki služi kot šifrant.
http://www.w3schools.com/sql/sql_foreig...
http://www.tutorialspoint.com/sql/sql-f...
Keye se ponavadi dela s sekvencami
http://www.w3schools.com/sql/sql_autoin...
http://www.w3schools.com/sql/sql_foreig...
http://www.tutorialspoint.com/sql/sql-f...
Keye se ponavadi dela s sekvencami
http://www.w3schools.com/sql/sql_autoin...
uro10 ::
create table xxx_prireditve
(sifra integer, ekipa_sifra varchar2(2), drzava_sifra varchar2(3), ime varchar2(15), stobiskovalcev integer, caszacetka integer, trajanje integer);
create unique index xxx_prireditve_pk on xxx_prireditve (sifra);
alter table xxx_prireditve add constraint prireditve_pk primary key (sifra) enable validate;
create table xxx_letalo
(sifra integer, ekipa_sifra varchar2(2), prireditev_drzava_sifra varchar2(3), prireditev_ekipa_sifra varchar2(2), prireditev_sifra integer, ime varchar2(15), stobiskovalcev integer, caszacetka integer, trajanje integer);
alter table xxx_letalo
add constraint prireditev_sifra_fk
foreign key (prireditev_sifra)
references xxx_prireditve (sifra);
zgoraj je nakazano samo za FK na eno tabelo
ko delaš insert moraš najprej narediti insert v tabelo prireditve in šele nato v tabelo letalo
lp
In kako potem vnašam, nevem kako uporabiti insert stavek z nested selectom. Ključe pa lahko naredim tudi kar že v create table, da mi ni potem treba še enkrat alter table ali ne?
Zgodovina sprememb…
- spremenilo: uro10 ()
Spura ::
Teh stvari se ne dela tako. Ce je sifra prireditve primary key, zakaj imas FK iz tabele letalo na tri stolpce v tabeli prireditve? Rabis samo fk na sifro. Ubistvu imas denormalizirano vse, ker zdaj imas stolpce kot je prireditev_drzava v tabeli letalo, torej ce v tabeli prireditev spremenim drzavo se mora tudi v tabeli letalo posodabljat. Zakaj ima entiteta letalo podatke o prireditvi notr? Potem imas za eno fizicno letalo vec vrstic notr. Zdej ne vidim celega modela ampak mislim da bi moral imet tako:
tabela ekipa (samo podatki o ekipi)
tabela letalo (kjer so notri samo podatki o letalu)
tabela prireditev (samo podatki o prireditvi)
Naprej pa odvisno od tega, ali so letala vezana na ekipe (torej ali se lahko isto letalo uporablja vec ekip).
Najbolj splosni setup, kjer lahko isto letalo uporabljajo razlicne ekipe na isti ali pa razlicnih prireditvah je da imas
preprosto eno tablo s stolpci:
(id_prireditve, id_ekipe, id_letala)
ce hoces imet da so letala vezana ne ekipe imas pa dve dodatni tabeli
(sifra, id_ekipe, id_letala) - tle je lahko se kak stolpec ce je to aktivno letalo, tako da imas lahko pregled trenutnih letal ki jih ekipa ima v uporabi, hkrati pa ti ostanejo zapisi od prej
(sifra_od_zgoraj, id_prireditve)
V tem primeru so letala vezana na ekipe, in ekipa ima na prireditvi specificna letala, ne pa nujno vseh ki jih imajo.
tabela ekipa (samo podatki o ekipi)
tabela letalo (kjer so notri samo podatki o letalu)
tabela prireditev (samo podatki o prireditvi)
Naprej pa odvisno od tega, ali so letala vezana na ekipe (torej ali se lahko isto letalo uporablja vec ekip).
Najbolj splosni setup, kjer lahko isto letalo uporabljajo razlicne ekipe na isti ali pa razlicnih prireditvah je da imas
preprosto eno tablo s stolpci:
(id_prireditve, id_ekipe, id_letala)
ce hoces imet da so letala vezana ne ekipe imas pa dve dodatni tabeli
(sifra, id_ekipe, id_letala) - tle je lahko se kak stolpec ce je to aktivno letalo, tako da imas lahko pregled trenutnih letal ki jih ekipa ima v uporabi, hkrati pa ti ostanejo zapisi od prej
(sifra_od_zgoraj, id_prireditve)
V tem primeru so letala vezana na ekipe, in ekipa ima na prireditvi specificna letala, ne pa nujno vseh ki jih imajo.
prozac ::
kot je spura napisu je najbols, da:
- najprej naredis tabele za sifrante (dimenzije) ekipa, letalo, prireditev. V teh tabelah imas samo toliko vrstic kot je različnih ekip, letal, prireditev. Vsaka vrstica ima svoj ID (šifro), ki je istočasno tudi primarni ključ. => kot je povedal spura je najlažje, da za številčenje uporabiš sekvence
- nato naredi eno skupno tabelo (fact tabelo), ki povezuje zapise iz različnih šifrantov. Tu se lahko ponavljajo primarni ključi šifrantov (zato na to tabelo narediš foreign key-e). Najbolj primerna struktura fact tabele je, da vključuje samo IDje iz šifrantov in potrebne izpeljane podatke (mere / izračunane podatke, ki jih potrebuješ v nadaljnjih postopkih / prikazu podatkov na GUI,...). Ce podatkov ni potrebno sproti izračunavati, ampak se jih samo prikliče iz baze, deluje to veliko hitreje.
S prakso sem ugotovil, da se podatkovni model s časom dosti manj spreminja (in je dosti bolj fleksibilen), če že na začetku v dimenzijah predividiš polje tip (vrsta, namen) in status. Na ta način lahko v istem šifrantu vsebino razvrščaš glede na različne namene, če se jim zaradi različnih namenov spreminjajo lastnosti ali jih mora aplikacija zaradi različnih namenov drugače obravnavati.
- najprej naredis tabele za sifrante (dimenzije) ekipa, letalo, prireditev. V teh tabelah imas samo toliko vrstic kot je različnih ekip, letal, prireditev. Vsaka vrstica ima svoj ID (šifro), ki je istočasno tudi primarni ključ. => kot je povedal spura je najlažje, da za številčenje uporabiš sekvence
- nato naredi eno skupno tabelo (fact tabelo), ki povezuje zapise iz različnih šifrantov. Tu se lahko ponavljajo primarni ključi šifrantov (zato na to tabelo narediš foreign key-e). Najbolj primerna struktura fact tabele je, da vključuje samo IDje iz šifrantov in potrebne izpeljane podatke (mere / izračunane podatke, ki jih potrebuješ v nadaljnjih postopkih / prikazu podatkov na GUI,...). Ce podatkov ni potrebno sproti izračunavati, ampak se jih samo prikliče iz baze, deluje to veliko hitreje.
S prakso sem ugotovil, da se podatkovni model s časom dosti manj spreminja (in je dosti bolj fleksibilen), če že na začetku v dimenzijah predividiš polje tip (vrsta, namen) in status. Na ta način lahko v istem šifrantu vsebino razvrščaš glede na različne namene, če se jim zaradi različnih namenov spreminjajo lastnosti ali jih mora aplikacija zaradi različnih namenov drugače obravnavati.
uro10 ::
prozac ::
če hočeš imeti v tabeli letalo več zapisov s šifro 1 potem šifra ne sme biti primary key.
jaz mislim da moraš imeti v tabeli letalo samo 1 zapis za letalo 1 in samo 1 zapis za letalo 2 itn. Prav tako mora imeti v tabeli prireditev samo 1 zapis za prireditev 1 in samo 1 zapis za prireditev 2 itn. V obeh primerih mora biti šifra primary key.
Potem pa si narediš novo (povezovalno) tabelo, kjer imaš v vsaki vrstici posebej napisano:
idzapisa1: letalo1 na prireditvi 1
idzapisa2: letalo1 na prireditvi 2
idzapisa3: letalo2 na prireditvi 2
...
na tej tabeli imaš primary key idzapisa ter foreign key-e na tabele letalo (sifra_letala) in prireditev (sifra_prireditve).
jaz mislim da moraš imeti v tabeli letalo samo 1 zapis za letalo 1 in samo 1 zapis za letalo 2 itn. Prav tako mora imeti v tabeli prireditev samo 1 zapis za prireditev 1 in samo 1 zapis za prireditev 2 itn. V obeh primerih mora biti šifra primary key.
Potem pa si narediš novo (povezovalno) tabelo, kjer imaš v vsaki vrstici posebej napisano:
idzapisa1: letalo1 na prireditvi 1
idzapisa2: letalo1 na prireditvi 2
idzapisa3: letalo2 na prireditvi 2
...
na tej tabeli imaš primary key idzapisa ter foreign key-e na tabele letalo (sifra_letala) in prireditev (sifra_prireditve).
miko22 ::
Malo si sposodim temo:
imam tabelo oseb z šiframi.1 oseba ima lahko več šifer.
Rad bi imel count vseh oseb ki imajo šifro 3,4, toda ne smejo biti pod šifro 1, čeprav tudi obstaja.
Malo nerodno sem se izrazil...hm
torej šteje mi vse osebe v tabeli ki so pod šifro 3 in 4, toda če obstaja zapis tudi pod 1, ga ne sme štet, tudi če obstaja zapis pod 3 in 4.
načeloma moram dobiti 2 različni cifri. število oseb ki so pod šifro 3 in 4 in pa število oseb, ki so pod šifro 3 in 4, pa ni pod šifro 1.
imam tabelo oseb z šiframi.1 oseba ima lahko več šifer.
Rad bi imel count vseh oseb ki imajo šifro 3,4, toda ne smejo biti pod šifro 1, čeprav tudi obstaja.
Malo nerodno sem se izrazil...hm
torej šteje mi vse osebe v tabeli ki so pod šifro 3 in 4, toda če obstaja zapis tudi pod 1, ga ne sme štet, tudi če obstaja zapis pod 3 in 4.
načeloma moram dobiti 2 različni cifri. število oseb ki so pod šifro 3 in 4 in pa število oseb, ki so pod šifro 3 in 4, pa ni pod šifro 1.
Tody ::
select count(sfira_osebe), sifra_osebe from tabela_z_podatki where sifra_osebe != '1'
group by sifra_osebe
če bi rad imel samo unikatne zapise potem daš vmes še distinct --> count(distinct(sifra_osebe))
group by sifra_osebe
če bi rad imel samo unikatne zapise potem daš vmes še distinct --> count(distinct(sifra_osebe))
OracleDev ::
A imaš šifre v child tabeli, glede na to da si napisu "1 oseba ima lahko več šifer.".
Če ja potem je pomoje nekaj takega:
select count(o.id)
from oseba o, oseba_sifra os
where
o.oid = os.oid and
o.sifra in (3,4)
and not exists (select 1 from oseba_sifra o2 where o2.oid = o.oid and o2.sifra = 1)
Če ja potem je pomoje nekaj takega:
select count(o.id)
from oseba o, oseba_sifra os
where
o.oid = os.oid and
o.sifra in (3,4)
and not exists (select 1 from oseba_sifra o2 where o2.oid = o.oid and o2.sifra = 1)
miko22 ::
A imaš šifre v child tabeli, glede na to da si napisu "1 oseba ima lahko več šifer.".
Če ja potem je pomoje nekaj takega:
select count(o.id)
from oseba o, oseba_sifra os
where
o.oid = os.oid and
o.sifra in (3,4)
and not exists (select 1 from oseba_sifra o2 where o2.oid = o.oid and o2.sifra = 1)
Hvala, tole deluje.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | SQL težava z vmesnimi tabelamiOddelek: Programiranje | 1849 (1454) | zavajon |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1067 (872) | detroit |
» | PostgreSQL pomočOddelek: Programiranje | 2522 (2015) | Mato989 |
» | SQL Parent key not foundOddelek: Programiranje | 1071 (994) | Ciklamen |
» | SQL težavaOddelek: Programiranje | 5231 (4513) | joseti |