Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

SQL upit. Gde gresim?

[es] :: Baze podataka :: SQL upit. Gde gresim?

[ Pregleda: 2601 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

LightBow
London

Član broj: 4829
Poruke: 158
*.bmly.cable.ntl.com.



+1 Profil

icon SQL upit. Gde gresim?08.05.2007. u 20:56 - pre 206 meseci
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
 
Odgovor na temu

mb_sa

Član broj: 50529
Poruke: 172
*.PPPoE-4082.sa.bih.net.ba.



Profil

icon Re: SQL upit. Gde gresim?08.05.2007. u 21:20 - pre 206 meseci
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
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: SQL upit. Gde gresim?08.05.2007. u 23:06 - pre 206 meseci
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



Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

LightBow
London

Član broj: 4829
Poruke: 158
84.13.228.*



+1 Profil

icon Re: SQL upit. Gde gresim?09.05.2007. u 00:38 - pre 206 meseci
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.
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
213.244.228.*

Sajt: www.baze-podataka.net


+4 Profil

icon Re: SQL upit. Gde gresim?09.05.2007. u 09:26 - pre 206 meseci
Nije problem u IN, vec je problem u Cartesian join-u:
Code:

from module m, studentMarks sm

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

[es] :: Baze podataka :: SQL upit. Gde gresim?

[ Pregleda: 2601 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.