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

Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci

[es] :: MS SQL :: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci

[ Pregleda: 4037 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Phikret
Fikret Pašović
freelancer
Novi Pazar - Beograd

Član broj: 192541
Poruke: 71
*.dynamic.isp.telekom.rs.

Sajt: www.mojestudije.info


+2 Profil

icon Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci27.04.2015. u 22:30 - pre 108 meseci
Zdravo, potrebna mi je pomoc oko jednog upita. Ne mogu da se izborim. Moze biti da je trivijalan, ali ja ne vidim resenje. Evo o cemu se radi.
Uprosticu tabele, tj. smanjicu broj kolona radi preglednosti

Imam tabelu

1. knjige(idknjige,imeknjige)
2. zaduzenja(idknjige,idclana,datumzaduzenja,datumvracanja,vracena,id) //datumvracanja je datum kad treba da se vrati knjiga, a ne kad je vracena.

knjige

1 Gospodar Igre
2 Zlocin I Kazna
3 Na Drini Cuprija
4 Zovem se Crveno
5 IZNOGUD TVRDI POVEZ
6 ŠTRUMPFETA
7 KOMPLET VAMPIRSKI DNEVNICI: 8–1
8 Sezona oluja SEZONA OLUJA
9 PRIPOVESTI BARDA BIDLA



zaduzenja
idknjige,idclana,datumzaduzenja,datumvracanja,vracena,id
4 51 2015-04-23 2015-05-08 1 13
2 50 2015-04-23 2015-05-08 1 14
1 51 2015-04-24 2015-05-09 1 16
1 1 2015-04-27 2015-05-12 0 36

1 45 2015-04-27 2015-05-12 0 38
7 45 2015-04-23 2015-05-08 1 15

Zelim da upitom dobijem sve knjige koje su na raspolaganju za izadavanje u datom trenutku. To su knjige koje:

1. Nisu izdate, odnosno konkretno
1.1. Nema ih u tabeli zaduzenja (nisu nikad izdate)
1.2 Ima ih tabeli zaduzenja ali su vracene (razduzene), dakle kolona 'vracena' = 1

Primer obuhvata situaciju kad je knjiga sa id = 1 (Gospodar Igre) bila jednom izdata pa vracena i ostao je rekord u tabeli (to mi treba radi vođenja evidencije izdavanja knjige), a
takođe ista ta knjiga trenutno izdata. E sad, tu mi je problem. Ja želim da mi upit vrati samo one knjige koje su na raspolaganju. Žonglirao sam upitima, radio except, ali nisam na kraju uspeo da se izvučem. Evo jednog upita za koga sam mislio da mi radi posao:

select k.id, k.naziv,k.autor,k.isbn,k.izdavac,zad.vracena from knjige k
left outer join zaduzenja zad on zad.id_knjige = k.id
where zad.vracena = 1 or zad.vracena is null

Medjutim ako je knjiga bar jednom izdata, ovaj upit mi vraca i nju, a bas nju ne zelim ako je i u tom trenutku izdata. To je situacija sa knjigom "Gospodar Igre" koju sam opisao gore. Nadam se da sam preneo dobro problem. Ako nisam, pitajte da razjasnim jos jednom
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


 
Odgovor na temu

mkaras
Marko Karas
Beograd

Član broj: 66087
Poruke: 427



+19 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci27.04.2015. u 23:22 - pre 108 meseci
Napravi privremenu tabelu ili upit sa knjigama koje nisu vraćene, dakle kolona 'vracena' = 0 i selektuj sve knjige koje se ne nalaze u tabeli zauzetih knjiga. To bi trebalo da ti da spisask slobodnih knjiga.
 
Odgovor na temu

ventura

Član broj: 32
Poruke: 7781
*.dynamic.sbb.rs.



+6455 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci27.04.2015. u 23:56 - pre 108 meseci
Sama organizacija baze ti je prilično nesrećno zamišljena...Ali ako baš voliš tako, onda ti ovaj upit vraća sve slobodne knjige:

Code:

SELECT k.id
FROM knjige AS k 
OUTER APPLY
     (SELECT TOP 1 * FROM zaduzenja z
        WHERE idknjige = k.id
        ORDER BY z.datumvracanja DESC) AS ds
WHERE ds.vracena = 1 OR ds.vracena IS NULL
ORDER BY k.id
 
Odgovor na temu

Phikret
Fikret Pašović
freelancer
Novi Pazar - Beograd

Član broj: 192541
Poruke: 71
82.117.198.*

Sajt: www.mojestudije.info


+2 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci28.04.2015. u 10:13 - pre 108 meseci
Hvala na savetima, probacu obe preporuke pa cu javiti. @Ventura, ovako sam postavio shemu jer mi je delovalo logicno i normalizovano. Znacio bi mi savet kako moze bolje da se izmodelira.

Dakle u zaduzenja tabeli imam kljuceve od tabele clan i tabele knjiga. zaduzenja tabela mu dodje agregacija te dve tabele i napravio sam je tako iskljucivo radi zadrzavanja istorije izdavanja knjige. Lakse je bilo da se iz te tabele brise red nakon sto se knjiga vrati i ne bih imao ovih problema.

Jedno resenje koje mi je bilo u glavi je da u knjiga tabeli imami polje 'vracena' koje bih azurirao prilikom pozajmljivanja - vracanja knjige, a tabela zaduzenja bi imala istoriju zaduzenja - vracanja. To bi znacilo da bi mi jednostavni select iz tabele knjiga gde je 'vracena' = 0 omogucio da filtriram samo knjige koje su na raspolaganju za izdavanje.

Iskreno prvi put cujem za outer apply naredbu i sada cu malo da se pozabavim njome i pokusam da shvatim tvoj upit.
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci28.04.2015. u 10:39 - pre 108 meseci
može i skupovnom operacijom MINUS

Code (sql):
SELECT idknjige FROM knjige
minus
SELECT idknjige FROM zaduzenja WHERE vracena = 0
 


Druga verzija sa NOT EXISTS

Code (sql):
SELECT * FROM knjige k
WHERE NOT EXISTS (
   SELECT DISTINCT 1
   FROM zaduzenja z
   WHERE z.idknjige = k.idknjige
   AND z.vracena = 0)
 


Tvoj problem je ovo:
Citat:
Zelim da upitom dobijem sve knjige koje su na raspolaganju za izadavanje u datom trenutku. To su knjige koje:

1. Nisu izdate, odnosno konkretno
1.1. Nema ih u tabeli zaduzenja (nisu nikad izdate)
1.2 Ima ih tabeli zaduzenja ali su vracene (razduzene), dakle kolona 'vracena' = 1


Nisi sebi u glavi raščistio šta ti treba, a treba ti u jednoj rečenici:

Treba dobiti sve knjige koje su u biblioteci, osim onih koje su na čitanju (polje vracena = 0).
Da si ovako sebi formulisao upit, lakše bi došao do rešenja.
 
Odgovor na temu

ventura

Član broj: 32
Poruke: 7781
95.180.115.*



+6455 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci28.04.2015. u 14:04 - pre 108 meseci
Citat:
Phikret:
Hvala na savetima, probacu obe preporuke pa cu javiti. @Ventura, ovako sam postavio shemu jer mi je delovalo logicno i normalizovano. Znacio bi mi savet kako moze bolje da se izmodelira.

Ja bi u tabeli sa knjigama dodao i polja "Količina" i "Raspoloživo", tako da svaki put kada ti neko zadužuje njigu ti je skidaš sa raspoloživog stanja, i obrnuto kad vraća knjigu. Na ovaj način ti imaš instantan pregled u stanje magacina uvidom u samo jednu tabelu, bez da moraš da peglaš komplikovane querije kroz sve transakcije+originalnu listu knjiga... jer to će možda sad i da ti radi dok je baza mala, ali zamisli za 10 godina i par miliona transakcija, koliko će ti onda trebati vremena da dobiješ samo nazad query da li je neka knjiga raspoloživa ili ne... Ili ako imaš više kopija jedne iste knjige, onda ti je sa tvojim načinom praćenje još više zakomplikovano.

Dakle jedna baza sa knjigama koja vodi količine i raspoloživo stanje + tabela sa transakcijama za detaljnije uvide, indeksiraš po idclana i idknjige i to ti je to...
 
Odgovor na temu

Phikret
Fikret Pašović
freelancer
Novi Pazar - Beograd

Član broj: 192541
Poruke: 71
*.com
Via: [es] mailing liste

Sajt: www.mojestudije.info


+2 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci28.04.2015. u 22:20 - pre 108 meseci
Bravo majstori! Svaki od predlozenih upita radi! U medjuvremenu sam se
konsultovao i sa kolegama. Dosli smo do ovog upita


select * from knjiga where id not in (select id_knjige from zaduzenje where
vracena = 0)

E sad, nakon konsultacija smo zakljucili da je ustvari vrlo jednostavno
izvuci ove podatke zato sto:

u tabeli zaduzenje, za jednu knjigu moze da se nadje samo jedan jedini red
koji ima 'vracena = 0' ili ni jedan takav red. Ako red postoji onda je on
uvek poslednji (tj sa najvecim id-em tabele zaduzenja, grupisano po
id_knjige). Pokusavali smo da trazimo max(id) pa da grupisemo po id_knjige
i dosli smo do upita koji radi. Kolega mi je zamerio da mu nisam dobro
preneo problem i da je uporno pokusavao da resi problem kada u tabeli
'zaduzenja' moze da se nadje vise redova za jednu knjigu u kojima je
'vracena = 0'. Na kraju smo dosli do ovog jednostavnog upita koji zavrsava
posao bas onako kako meni treba!

Samo da napomenem da kljucna rec MINUS ne postoji u TSQL-u (meni je nije
prepoznao u Sql Management Studio na Sql express 2008r2) i da je EXCEPT
kljucna rec za operaciju 'razlika skupova'. Nakon sto sam to izmenio u
upitu koji mi je ovde ponudjen, dobio sam zeljeni rezultat.

Hvala na predlozima i savetima. Ima ovde dosta zaniljivih detalja o kojima
moram da se podrobnije informisem.

Evo ovde cu napisati svih 4 upita koji rade isti posao:

1.
Code:
SELECT k.id
FROM knjige AS k
OUTER APPLY
     (SELECT TOP 1 * FROM zaduzenja z
        WHERE idknjige = k.id
        ORDER BY z.datumvracanja DESC) AS ds
WHERE ds.vracena = 1 OR ds.vracena IS NULL
ORDER BY k.id


2.
Code:
SELECT idknjige FROM knjige
EXCEPT
SELECT idknjige FROM zaduzenja WHERE vracena = 0


3.
Code:
SELECT * FROM knjige k
WHERE NOT EXISTS (
   SELECT DISTINCT 1
   FROM zaduzenja z
   WHERE z.idknjige = k.idknjige
   AND z.vracena = 0)


4.
Code:
select * from knjige where id not in (select id_knjige from
zaduzenja where vracena = 0)



--
Svako ima pravo da se kreće i da bude kreten...
www.mojestudije.info
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci29.04.2015. u 13:26 - pre 108 meseci
Samo jedna primedba:

Upit koji si ti napisao sa NOT IN je, verovatno, najgori od sva 4. Malo bolji je onaj koji sam ti ja dao sa MINUS, još bolji je venturin, a ubedljivo najbolji je sa NOT EXIST.

NOT IN i MINUS upiti dohvataju najviše redova i najsporiji su, dok su preostala dva dobra ako postoji indeks nad poljem idknjige tabele zaduženja.
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci01.05.2015. u 15:45 - pre 108 meseci
Dva puta mi nije uspelo da posaljem odgovor, ne znam sta se desava. Ajde da probamo ovako kratko.
 
Odgovor na temu

[es] :: MS SQL :: Pomoć oko upita. Razduženje - zaduženje knjiga u biblioteci

[ Pregleda: 4037 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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