[ LightBow @ 08.05.2007. 20:56 ] @
Pozdrav.
napravio sam bazu koja cuva podatke o studentima, osoblju fakulteta, ocenama itd. Problematican query treba da izlista ocene studenta za module (predmete) koje je polagao. Tabele su:
student (SudentID, StudentName,...)
module (ModuleID, ModuleName,....)
studentMarks(StudentID, ModuleID, Mark)

Query:
Code:
select m.ModuleID, m.ModuleName, sm.Mark from module m, studentMarks sm
       where m.ModuleID in
          ( select ModuleID from studentMarks  
            where StudentID = 1 AND Mark is not null);

Medjutim, umesto tri reda, ja dobijem 720, redova. Kada izvrsim samo subquery, dobijem tri. Broj redova u studentMarks tabeli je 240, dakle ja dobijam cisti dekartov proizvod.
Da li bi neko mogao ovo da objasni, jer ja ne vidim gde je greska u logici ovog queryja.
Hvala
[ mb_sa @ 08.05.2007. 21:20 ] @
Uopce nije potraban takav pristup, dovoljno je:

Code:
SELECT m.ModuleID, m.ModuleName, sm.Mark
FROM module m, studentMarks sm
WHERE m.ModuleID = sm.ModuleID
AND sm.StudentID =1 AND Mark is not null
GROUP BY sm.ModuleID
[ Miloš Baić @ 08.05.2007. 23:06 ] @
Možda nešto ovako:
Code:

-- PostgreSQL 8.2
-- Zbog jednostavnosti bez kljuceva
create table student(
 StudentID integer,
 StudentName varchar(20)
);

create table module(
 ModuleID integer,
 ModuleName varchar(20)
);

create table studentsMarks(
 StudentID integer,
 ModuleID integer,
 Marks varchar(20)
);

INSERT INTO student (StudentID, StudentName) VALUES (1, 'John Smit'); 
INSERT INTO student (StudentID, StudentName) VALUES (2, 'Abraham Lincoln');

INSERT INTO module (ModuleID, ModuleName) VALUES (1, 'History'); 
INSERT INTO module (ModuleID, ModuleName) VALUES (2, 'Geography');

INSERT INTO studentsMarks (StudentID, ModuleID, Marks) VALUES (1, 1, 8); 
INSERT INTO studentsMarks (StudentID, ModuleID, Marks) VALUES (1, 2, 10);

INSERT INTO studentsMarks (StudentID, ModuleID, Marks) VALUES (2, 1, 7); 
INSERT INTO studentsMarks (StudentID, ModuleID, Marks) VALUES (2, 2, 9);

--ako su evidentirani samo polozeni ispiti
--uslov da sm.Marks ne moze biti null
SELECT s.StudentName, m.ModuleName, sm.Marks
FROM ((studentsMarks sm
 LEFT JOIN student s ON sm.StudentID = s.StudentID)
 LEFT JOIN module m ON sm.ModuleID = m.ModuleID)
GROUP BY s.StudentName, m.ModuleName, sm.Marks

--uslov da sm.Marks moze biti null
SELECT s.StudentName, m.ModuleName, sm.Marks
FROM ((studentsMarks sm
 LEFT JOIN student s ON sm.StudentID = s.StudentID)
 LEFT JOIN module m ON sm.ModuleID = m.ModuleID)
WHERE sm.Marks is not null
GROUP BY s.StudentName, m.ModuleName, sm.Marks


[att_img]
[ LightBow @ 09.05.2007. 00:38 ] @
Hvala, ovi vasi upiti naravno resavaju problem. Samo mi nije jasno zasto ne moze koristeci IN, jer sudeci prema silnim tutorijalima koje sam procitao trebalo bi da radi.
Izgleda da je ipak praksa najvaznija.
[ chachka @ 09.05.2007. 09:26 ] @
Nije problem u IN, vec je problem u Cartesian join-u:
Code:

from module m, studentMarks sm