[ nemshooo @ 04.02.2012. 11:59 ] @
Mala pomoć u redavanju domaceg zadatka... ,

Imam problema sa prikazom kolona spojenih tabela.
Struktura upita bi izgledala ovako:


SELECT kz.datum, k.brojDos, k.ocena, k.sifPred, k.sifPredav, k.rbrPlan, kz.brojdos, nst.ESP, nst.Semes
FROM komZap k
JOIN komZapSp kz ON kz.rbrZap=k.rbrZap
JOIN nasPlan np ON np.rbrPlan=k.rbrPlan
JOIN nasPlanSt nst ON nst.rbrPlan=np.RbrPlan
where np.Godina>2009


STRUKTURA TABELA sa kljucevima (sema)

1. komZap (rbrZap(pk)*, ocena, sifpred, sifpredav,rbrPlan(FK), ) gde je rbrZap primarni kljuc, a "rbrPlan" je strani kljuc koji predstavlja referencu na tabelu "nasPlan"
2. komZapSp (rbrZap(pk, fk)*, rbrStavke(pk), brojdos, datum) ge je primarni kljuc kombijacija kolona "rbrZap i rbrStavke", stim da je kljucna kolona "rbrZap" istovremeno i referenca na tabeli "komZap"
3. nasPlan (rbrPlan(pk)*, naziv, godina, napomena) gde je kolona "rbrPlan" primarni kljuc tabele "nasPlan"
3. nasPlanSt (rbrPlan(pk, fk), rbrStavke(pk), sifpre, seme, ESP, semes) gde je primarni kljuc kombinacija kolona "rbrPlan, rbrStavke", stim da je kljucna kolona "rbrPlan" istovremeno i referenca na tabeli "nasPlan"


Ono sto je problem, jeste sama struktura upita. Ja ne znam bolje da ga sastavim a da dobijem validnije rezultate. Ovakom kombinacijom spojenih tabela trebalo bi da dobijem nekih 1500 zapisa, medjutim, ja dobijem preko 10.000, sto upućuje na to da se tabele unakrsno spajaju. Kada izbacim (trazenom izvestaju dosta bitne kolone) kolone "nst.ESP" i "nst.Cena" koje pripadaju tabeli "nasPlanSt", dobijam odgovarajuce rezultate, ali bez te dve kljucne kolone sam rezultat upita mi je nevažan. Ne znam sta da radim, kako da organizujem upite.

Jos nesto da napomenem, tabela "nasPlanSt" ne sadrzi sva kljucne verdnosti tabele "nasPlan", dok tabela "komZapSp" sadrži sve ključne vrednosti tabele "komZap".
Takođe, tabela "KomZap" sadrži sva ključne vrednosti tabele "nasPlan".

Nadam se da mi nećete zameriti zbog verovatno prisutnih gresaka u tekstu ali i rigidnije šeme tabela. Mislio sam da će tako tekst biti čitljiviji!

Hvala u napred.



[ djoka_l @ 04.02.2012. 13:34 ] @
Drage volje bih ti pomogao, ali nemam pojma šta pitaš. Umesto da rečima opišeš šta treba da dobiješ, daješ upit koji ne radi.

Osim toga, kako može u upitu da stoji kolona k.brojDos, kada u tabeli komZap ne postoji to polje?
[ rambo @ 04.02.2012. 16:47 ] @
Samo jedan kratak komentar.

Nikada mi neće biti jasno zašto ljudi vole da koriste skraćene (i veoma skraćene) nazive tabela i kolona?

Kada gledam ovakvu strukturu i upite, jednostavno se zapitam kako i sam autor može uopšte nešto da razume ako su nazivi toliko skraćeni da iz njihovog naziva jedva da može da se nasluti čemu koja kolona služi.

Savetujem svima da ne štede na dužini naziva tabela i kolona. Svi moderni RDBMS odavno dozvoljavaju bar po 250 znakova u tim nazivima. Iz iskustva znam da to značajno olakšava razumevanje DB šeme čak i nekome sa strane, a naročito onima koji rade na tome.

Što se tiče samog pitanja, autor bi trebao da prepiše tekst zadatka da bi smo razumeli šta se traži kako bi smo mogli da pomognemo.
[ nemshooo @ 08.02.2012. 12:34 ] @
Oki, bicu precizniji i sa malo vise informacija.

P

Code:

  CREATE DATABASE studentSErvice
GO
USE studentService
go

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Plan_i_program](
    [idPlana] [int] NOT NULL,
    [idSmer] [char](2) NOT NULL,
    [yearOfStudy] [int] NOT NULL,
    [StudijskiPlan] [nchar](10) NULL,
 CONSTRAINT [PK__Curriculum] PRIMARY KEY CLUSTERED 
(
    [idPlana] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Plan_i_program_stavke]    Script Date: 02/08/2012 12:52:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Plan_i_program_stavke](
    [idplana] [int] NOT NULL,
    [IdIPlanStavke] [int] NOT NULL,
    [sifPredmeta] [int] NOT NULL,
    [Semester] [int] NULL,
    [ESPB] [money] NULL,
 CONSTRAINT [pk_idCurriculumIdItems_ci] PRIMARY KEY CLUSTERED 
(
    [idplana] ASC,
    [IdIPlanStavke] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[KomisijskiZapisnik]    Script Date: 02/08/2012 12:52:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[KomisijskiZapisnik](
    [idReport] [int] NOT NULL,
    [idPlana] [int] NULL,
    [Date] [date] NULL,
    [sifPredmeta] [int] NOT NULL,
    [idProfesor] [int] NOT NULL,
 CONSTRAINT [pk_idReport_C] PRIMARY KEY CLUSTERED 
(
    [idReport] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[KomisijskZapisnikStavke]    Script Date: 02/08/2012 12:52:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[KomisijskZapisnikStavke](
    [idZapisnika] [int] NOT NULL,
    [idZapisnikaStavke] [int] NOT NULL,
    [studentIndeks] [int] NOT NULL,
    [Note] [varchar](50) NULL,
    [ocena] [int] NULL,
 CONSTRAINT [pk_idReporti_idItemsreportis_CRD] PRIMARY KEY CLUSTERED 
(
    [idZapisnika] ASC,
    [idZapisnikaStavke] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  ForeignKey [FK_idCurriculum_crc]    Script Date: 02/08/2012 12:52:34 ******/
ALTER TABLE [dbo].[KomisijskiZapisnik]  WITH CHECK ADD  CONSTRAINT [FK_idCurriculum_crc] FOREIGN KEY([idPlana])
REFERENCES [dbo].[Plan_i_program] ([idPlana])
GO
ALTER TABLE [dbo].[KomisijskiZapisnik] CHECK CONSTRAINT [FK_idCurriculum_crc]
GO
/****** Object:  ForeignKey [FK_idCurriculum_ciiss]    Script Date: 02/08/2012 12:52:34 ******/
ALTER TABLE [dbo].[KomisijskZapisnikStavke]  WITH CHECK ADD  CONSTRAINT [FK_idCurriculum_ciiss] FOREIGN KEY([idZapisnika])
REFERENCES [dbo].[KomisijskiZapisnik] ([idReport])
GO
ALTER TABLE [dbo].[KomisijskZapisnikStavke] CHECK CONSTRAINT [FK_idCurriculum_ciiss]
GO
/****** Object:  ForeignKey [FK_idCurriculum_cic]    Script Date: 02/08/2012 12:52:34 ******/
ALTER TABLE [dbo].[Plan_i_program_stavke]  WITH CHECK ADD  CONSTRAINT [FK_idCurriculum_cic] FOREIGN KEY([idplana])
REFERENCES [dbo].[Plan_i_program] ([idPlana])
GO
ALTER TABLE [dbo].[Plan_i_program_stavke] CHECK CONSTRAINT [FK_idCurriculum_cic]
GO



ALTER AUTHORIZATION ON DATABASE::StudentService TO nemsho



INSERT FILE
Code:

INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (43, N'15', 2009, N'2009/10   ')
INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (44, N'20', 2009, N'2009/10   ')
INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (45, N'29', 2009, N'2009/10   ')
INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (46, N'30', 2009, N'2009/10   ')
INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (47, N'31', 2009, N'2009/10   ')

INSERT [dbo].Plan_i_program_stavke (idplana, IdIPlanStavke, sifPredmeta, [Semester], [ESPB]) VALUES (43, 1, 520, 1, 6.0000)
INSERT [dbo].Plan_i_program_stavke (idplana, IdIPlanStavke, sifPredmeta, [Semester], [ESPB]) VALUES (43, 2, 501, 2, 8.0000)
INSERT [dbo].Plan_i_program_stavke (idplana, IdIPlanStavke, sifPredmeta, [Semester], [ESPB]) VALUES (43, 3, 506, 1, 4.0000)
INSERT [dbo].Plan_i_program_stavke (idplana, IdIPlanStavke, sifPredmeta, [Semester], [ESPB]) VALUES (43, 4, 507, 3, 5.0000)
INSERT [dbo].Plan_i_program_stavke (idplana, IdIPlanStavke, sifPredmeta, [Semester], [ESPB]) VALUES (43, 5, 521, 1, 4.0000)

INSERT [dbo].[KomisijskiZapisnik] (idZapisnika, idPlana, Date, sifPredmeta, idProfesor) VALUES (6949, 43, CAST(0x61320B00 AS Date), 507, 90)
INSERT [dbo].[KomisijskiZapisnik] (idZapisnika, idPlana, Date, sifPredmeta, idProfesor)  VALUES (6974, 43, CAST(0x6D320B00 AS Date), 520, 1)
INSERT [dbo].[KomisijskiZapisnik] (idZapisnika, idPlana, Date, sifPredmeta, idProfesor)  VALUES (7028, 43, CAST(0x6B320B00 AS Date), 501, 33)
INSERT [dbo].[KomisijskiZapisnik] (idZapisnika, idPlana, Date, sifPredmeta, idProfesor) VALUES (7195, 43, CAST(0x74320B00 AS Date), 506, 92)
INSERT [dbo].[KomisijskiZapisnik] (idZapisnika, idPlana, Date, sifPredmeta, idProfesor)  VALUES (7429, 43, CAST(0xBA320B00 AS Date), 520, 1)

INSERT [dbo].KomisijskZapisnikStavke (idZapisnika, idZapisnikaStavke, studentIndeks, Note, ocena) VALUES (6949, 1, 1317, NULL, 7)
INSERT [dbo].KomisijskZapisnikStavke (idZapisnika, idZapisnikaStavke, studentIndeks, Note, ocena) VALUES (6974, 1, 1317, NULL, 7)
INSERT [dbo].KomisijskZapisnikStavke (idZapisnika, idZapisnikaStavke, studentIndeks, Note, ocena) VALUES (7028, 1, 1292, NULL, 8)
INSERT [dbo].KomisijskZapisnikStavke (idZapisnika, idZapisnikaStavke, studentIndeks, Note, ocena) VALUES (7195, 2, 1293, NULL, 7)
INSERT [dbo].KomisijskZapisnikStavke (idZapisnika, idZapisnikaStavke, studentIndeks, Note, ocena) VALUES (7429, 3, 1294, NULL, 8)




Meni su potrebe informacije iz sve četri tabele. Konkretnije, hoću informaciju o tome npr, koliko studenata je polozilo ispit, a kojom ocenom, u kom semestu se slusao i koliko bodova nose položeni predmeti. Međutim, posle JOIN-ovanja umesto da dobijem rezutate sa 5 redova, dobijam multiplikovane podatke. Kontam da je problem u kardinalitetu, odnoso relaciji jedan-prema-više tabele Plana_i_program u odnosu na tabele KomisijskiZapisik i Plan_i_program_stavke. Za svaki predmet (nakom spajanja tih tabela), koji se nalazi u rezultatu pod određenim brojem Plana_i_programa, se multiplikuju svi bodovi koji se nalate u stavkama, a takođe se multiplikuju i godine na kojima se taj predmet slusa. Tako na primer, predmet pod rednim 507 u result setu nosi sve moguće kombinacije bodova kao i sve moguće semestre na kojima se pojedini predmeti slušaju.

Upit kojim sa pokusao da resim problem:

Code:

SELECT KSP.idPlana, ksp.studentIndeks, ksp.sifPredmeta, ksp.ocena, pps.ESPB, pps.semester
FROM 
(SELECT pl.idplana, kzt.studentIndeks, kz.sifPredmeta, kzt.ocena
 FROM KomisijskiZapisnik kz
 INNER JOIN KomisijskZapisnikStavke kzt ON kz.idZapisnika=kzt.idZapisnika
 INNER JOIN Plan_i_program pl ON pl.idPlana=kz.idPlana) ksp 
 INNER JOIN Plan_i_program_stavke pps ON pps.idPlana=ksp.idplana 


rezultat upita:
Code:

idPlana    studentIndeks    sifPredmeta    ocena    ESPB    Semester
43    1317    507    7    6,00    1
43    1317    507    7    8,00    2
43    1317    507    7    4,00    1
43    1317    507    7    5,00    3
43    1317    507    7    4,00    1
43    1317    520    7    6,00    1
43    1317    520    7    8,00    2
43    1317    520    7    4,00    1
43    1317    520    7    5,00    3
43    1317    520    7    4,00    1
43    1292    501    8    6,00    1
43    1292    501    8    8,00    2
43    1292    501    8    4,00    1
43    1292    501    8    5,00    3
43    1292    501    8    4,00    1
43    1293    506    7    6,00    1
43    1293    506    7    8,00    2
43    1293    506    7    4,00    1
43    1293    506    7    5,00    3
43    1293    506    7    4,00    1
43    1294    520    8    6,00    1
43    1294    520    8    8,00    2
43    1294    520    8    4,00    1
43    1294    520    8    5,00    3
43    1294    520    8    4,00    1


Samo da napomenem, sve tabele nose isti broj redova, na osnovu čega se da zaključiti da da i krajnji rezultat treba da nosi 5 torki.

Primetite da se u rezultatu vidi da npr. predmet sa sifrom 507 nosi više različitih vrednosti ESPB-a. Takođe se taj predmet sluša u više semestara. to je prosto ne moguće. Nemam pojma šta da uradim da bi te stavari doveo u red. Pokusao sam i proceduru da napisem, ali ne ide.



Samo da napomenem, sve tabele nose isti broj redova, na osnovu čega se da zaključiti da da i krajnji rezultat treba da nosi 5 torki.

Iz rezultata da se primetiti da se kod jednog predmeta pojavljuje vise različitih ESPB bodova. Takođe, da se primetiti da je student slušao predmet u više semstara. To me ubija




P.S . Znam da model nije ispravan, i da bi stvari trebalo drugačije postaviti, ali vas molim da mi pomognete.

Pozzz






[Ovu poruku je menjao nemshooo dana 08.02.2012. u 14:07 GMT+1]
[ djoka_l @ 08.02.2012. 14:05 ] @
Uh, ne volim da koristim INNER JOIN, više volim da uslove spajanja stavljam u WHERE uslov.

U svakom slučaju, ovde ti fali spajanje sifPredmeta iz tabele KomisijskiZapisnik sa sifPredmeta iz Plan_i_Program_Stavke.

Probaj da dodaš jedno:

WHERE pps.sifPredmeta=ksp.sifPredmeta

na kraj upita, pa javi kako je prošlo...
[ HladankaoLed @ 08.02.2012. 14:15 ] @
Citat:
nemshooo: Oki, bicu precizniji i sa malo vise informacija.

P

Code:

  CREATE DATABASE studentSErvice
...



Code:

INSERT [dbo].Plan_i_program (idPlana, idSmer, yearOfStudy, StudijskiPlan) VALUES (43, N'15', 2009, N'2009/10   ')
...



Najpre da te pohvalim za prilozeni kod. Ovakav pristup eliminise nepotrebni napor i umnogome olaksava posao nekome ko zeli da pomogne, a ujedno i pokazuje da se postavljac problema sa svoje strane maksimalno potrudio da objasni problem. Posle pohvale, jedna kritika :)

Iz svega prilozenog ne vidim postavku problema. Ono sto vidimo je
Citat:

Meni su potrebe informacije iz sve četri tabele. Konkretnije, hoću informaciju o tome npr, koliko studenata je polozilo ispit, a kojom ocenom, u kom semestu se slusao i koliko bodova nose položeni


Ovo ne zvuci kao postavka zadatka. Ovo "npr," relativizuje stvar i cini postavku nesigurnom. Pitanje treba da bude jasno postavljeno kako bi se izbegli nesporazumi. Ovo potanje ovde ne korespondira sa napisanim upitom i rezultatima dole. Sustinska je razlika u pitanjima koliko i koji. Cim se u pitanju pojavljuje koliko to implicira koriscenje agregatne funkcije.

Citat:

Upit kojim sa pokusao da resim problem:
Code:

..

rezultat upita:


Elem, ovde bih voleo da vidim zeljeni rezultat, a ne rezultat upita. Ako vec upit nije dobar i ako smo vec dobili kod za CREATE TABLE i INSERT onda bi bilo lepo sve to zaokruziti zeljenim rezultatom.

OK. Ajde sad posto sam dosta tupio da ti konkretno pomognem...Ako sam dobro pretpostavio sta zelis u zadatku onda bi sledeci upit trebalo da dovede do zeljenog outputa. Ti ces proveriti da li je to tako.

Code:

SELECT kz.idPlana, kzs.studentIndeks, kz.sifPredmeta, kzs.ocena, pps.ESPB , pps.Semester
FROM KomisijskiZapisnik kz
INNER JOIN Plan_i_program_stavke pps
    ON pps.idplana=kz.idplana AND pps.sifPredmeta=kz.sifPredmeta
INNER JOIN KomisijskZapisnikStavke kzs
    ON kz.idreport = kzs.idZapisnika



Citat:

P.S . Znam da model nije ispravan, i da bi stvari trebalo drugačije postaviti, ali vas molim da mi pomognete.

Kad vec zakeram duz celog posta, da ostanem dosledan sebi i ovde :) Ako vec poznato da model nije ispravan onda ne treba dalje razvijati aplikaciju! Sve nejasnoce iz modela prenose se na sve slojeve (i sve involvirane u projekat) razvoja i predstavljaju sjajan i nepresusni izvor nesporazuma i nepotrebnog prepravljanja i testiranja. Jednostavno ako model nije dobar treba ga popraviti. Modeluje se real-life problem. Ako razvijalac baze ili aplikacije zna da je model los i ne veruje mu, kako onda moze da ocekuje da ce aplikacija da ima business value? Mozda ovo zvuci kao cepidlacenje, ali nije. Veoma je bitno i ako se to ne popravi odmah posto se uoci, ako se ostavi za kasnije, nikada nece doci na red. Mnogu sam nepravilnost i korekciju ostavio za neko kasnije vreme (iz raznih razloga ili izgovora) i sve i jedan put se gorko pokajao zbog toga.

Pozdrav,
Milos
[ nemshooo @ 08.02.2012. 16:34 ] @
Momci, puno vam hvala. Ne mogu da verujem da sam toliko glupav ispao. Totalno ne iskustvo. Izuzetno jednostavno, i na dva nacina moguce resenje.


Djoka_l-i i HladankaoLed, hvala jos jednom. Skratili ste me muka.


Pozzzzz