» »

SQL pomoč

SQL pomoč

uro10 ::

Pozdravljeni

V DBDesignerju imam sledeč model in v tabeli LETALO se mi pojavijo ključi (prireditev_drzava_sifa) s povezanima dvema tabeloma. Zanima me kako to napišem v SQL stavku in kako potem polnim tabelo s temi ključi.

Lp.

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

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...

uro10 ::

prozac je izjavil:


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.

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.

uro10 ::

Kako pa bi napisal insert stavek da bi lahko letalo s sifro 1 bilo na večih prireditvah, ker če naredim še en insert stavek z isto sifro letala in drugo sifro prireditve mi vrne napako.

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).

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.

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))

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)

miko22 ::

OracleDev je izjavil:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL težava z vmesnimi tabelami

Oddelek: Programiranje
101684 (1289) zavajon
»

oracle 12 identity (the old way)

Oddelek: Programiranje
6984 (789) detroit
»

PostgreSQL pomoč

Oddelek: Programiranje
162355 (1848) Mato989
»

SQL Parent key not found

Oddelek: Programiranje
7971 (894) Ciklamen
»

SQL težava

Oddelek: Programiranje
364558 (3840) joseti

Več podobnih tem