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

SQL Mozgalice, mozgalica broj 2:

[es] :: Baze podataka :: SQL Mozgalice, mozgalica broj 2:

[ Pregleda: 5517 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon SQL Mozgalice, mozgalica broj 2:12.03.2007. u 14:41 - pre 207 meseci
Posto smo se lepo zabavili prvom mozgalicom, evo jos jedne. Ovo u stvari ne bi trebalo da bude tesko, ali sam priemtio da cesto dobijamo slicna pitanja na forumima, pa hajde da vidimo.

Ovako, imamo dve tabele iz prve mozgalice

CREATE TABLE Students (
StudentID INTEGER NOT NULL PRIMARY KEY
);

i

CREATE TABLE MinistredStudents (
StudentID INTEGER NOT NULL PRIMARY KEY REFERENCES Students,
MinistryNumber INTEGER NOT NULL UNIQUE
);

Tabele su u relaciji 1:1, gde je Students roditelj. StudentID mora da postoji u tabeli Students pre nego sto ga unesemo u tabelu MinistredStudents. U tabeli MinistredStudents NE MORA da postoji red za svakog students iz tabele Students. Pitanje:

Prikazati sve studente iz tabele Students za koje ne postoji red u tabeli MinistredStudents.

Za Access ekipu, ovo je cuveni "Unmatched query"

Na koliko nacina moze da se dobije isti rezultat - studenti koji su u tabeli Students ali nisu u tabeli MinistredStudents ?
 
Odgovor na temu

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

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



Profil

icon Re: SQL Mozgalice, mozgalica broj 2:12.03.2007. u 14:57 - pre 207 meseci
PostgreSQL:
Code:

CREATE VIEW noministrynumber AS 
 SELECT students.studentid
   FROM students
  WHERE NOT (EXISTS ( SELECT ministredstudents.studentid
           FROM ministredstudents
          WHERE ministredstudents.studentid = students.studentid));

Ovako, na brzinu, možda može i bolje da se napiše?
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.dialup.neobee.net.



+41 Profil

icon Re: SQL Mozgalice, mozgalica broj 2:12.03.2007. u 15:13 - pre 207 meseci
Ovo valjda svuda prolazi:
Code:

SELECT Students.StudentID 
FROM Students LEFT JOIN MinistredStudents ON Students.StudentID = MinistredStudents.StudentID 
WHERE MinistredStudents.StudentID IS NULL
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: SQL Mozgalice, mozgalica broj 2:12.03.2007. u 15:45 - pre 207 meseci
Evo i moj skromni predlog (testirano na MSSQL):

SELECT * FROM Students WHERE StudentId NOT IN (SELECT StudentId FROM MinistredStudents)
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.dialup.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: SQL Mozgalice, mozgalica broj 2:12.03.2007. u 16:12 - pre 207 meseci
PostgreSQL 8
Jednostavno A bez B kao u matematici:
Code:

SELECT StudentID
  FROM Students
EXCEPT
SELECT StudentID
  FROM MinistredStudents;



"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

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: SQL Mozgalice, mozgalica broj 2:12.03.2007. u 19:16 - pre 207 meseci
Pa ovo je svetlosna brzina
Ja ne mogu da se setim niceg vise, ako neko zna jos neki stos, samo napred. nece bas sve da radi na svim platformama, ali ideje su tu. Secam se jedne knjige o MS SQL 6.5 (!!!!) gde je autor uporedio dve varijante sa subkverijima:

SELECT students.studentid
FROM students
WHERE NOT (EXISTS ( SELECT ministredstudents.studentid
FROM ministredstudents
WHERE ministredstudents.studentid = students.studentid));

i

SELECT * FROM Students
WHERE StudentId
NOT IN (SELECT StudentId FROM MinistredStudents)

Varijanta sa NOT IN se lakse razume, ali moze da bude sporija od varijante sa EXISTS. U varijanti sa NOT IN, unutrasnji kveri se izvrsava ceo za svaki red iz vanjskog kverija i vrsi se uporedjenje. Zamislite da Students ima 2 miliona redova i da nekih 90% studentata postoji u tabeli ministredstudents. NOT IN varijanta bi za svaki od 2 miliona rdova u Students izvrsila SELECT StudentId FROM MinistredStudents, sto vraca 1,800,000 redova, i onda se tekuci rediz Students poredi sa rezultatom SELECT StudentId FROM MinistredStudents. Uz korektno indeksiranje, poredjenje je brzo, medjutim problem je vracanje 1,800,000 redova 2 miliona puta da bi se jedan red uporedio s tim. Varijanta sa EXISTS takodje zahteva da se subkveri (unutrasnji) izvrsi 2,000,000 puta, ali ce vratiti samo jedan red. Kveri koji vraca jedan red uvek je brzi od kverija koji vraca 1,800,000 redova. Ovo je vazilo za SQL Server 6.5. Probao sam isto na MS SQL 2005 i razlike nema. Zasto? Pa query optimizer za 2005 je postao pametniji. Optimizer u 2005 prvo odradi subkveri jednom, to sacuva u memoriji i onda svaki red poredi sa tim 'medju rezultatom'. Optimizer u verziji 6.5 ocigledno nije bio toliko pametan.

Naravoucenije: posto znate nekoliko varijanti, pre nego sto se odlucite, probajte da analizirate kveri i vidite sta cete dobiti. Za ad-hoc zahteve je svejedno, ali ako ce vas kveri da vraca podatke za neku web aplikaciju, onda vam je brzina itekako od znacaja.



 
Odgovor na temu

kcol
Vrbas

Član broj: 45405
Poruke: 12
195.252.123.*



Profil

icon Re: SQL Mozgalice, mozgalica broj 2:14.03.2007. u 09:43 - pre 207 meseci
u oracle-u najbrza varijanta...

SELECT StudentID
FROM Students
minus
SELECT StudentID
FROM MinistredStudents;



 
Odgovor na temu

[es] :: Baze podataka :: SQL Mozgalice, mozgalica broj 2:

[ Pregleda: 5517 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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