[ Neznalica_sa_ugla @ 02.09.2006. 22:44 ] @
Molim , kako ostvariti INTERSECT u bazi koja ga nema sql-2000 .
Hvala
Mozda ipak da se vidi i TABLICA i upit verovatno moze i drugacije

TABICA : RACUN

R_SIF TRGOVAC DIO KUPAC
1 S1 P1 J1
2 S1 P1 J4
3 S2 P3 J1
4 S2 P3 J2
5 S2 P3 J3
6 S2 P3 J4
7 S2 P3 J5
8 S2 P3 J6
9 S2 P3 J7
10 S2 P5 J2
11 S3 P3 J1
12 S3 P4 J2
13 S4 P6 J3
14 S4 P6 J7
15 S5 P1 J4
16 S5 P2 J2
17 S5 P2 J4
18 S5 P3 J4
19 S5 P4 J4
20 S5 P5 J4
21 S5 P5 J5
22 S5 P5 J7
23 S5 P6 J2
24 S5 P6 J4



UPIT-15. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji kupuju kod trgovca X sve
djelove koje on prodaje!
UPIT -16. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji sve dijelove koje im trebaju,
kupuju, između ostalog, i kod trgovca X!
BIO BI VEOMA ZAHVALAN NA BILO KAKAVOJ POMOCI




[Ovu poruku je menjao Neznalica_sa_ugla dana 03.09.2006. u 00:27 GMT+1]
[ chachka @ 03.09.2006. 00:09 ] @
Gde smo stali u Junu?

Inace tebi treba 'relational division'.
[ Neznalica_sa_ugla @ 03.09.2006. 03:30 ] @
Tako je onda stali , sada treba nastaviti ......
[ chachka @ 03.09.2006. 10:21 ] @
Drugi pristup: Matematička logika

(A INTERSECT B) <=> (A EXCEPT (A EXCEPT B))
i na srpskom
(A PRESEK B ) <=> (A BEZ (A BEZ B))

Ako MSSQL2000 ima EXCEPT eto ti resenja.
[ Neznalica_sa_ugla @ 03.09.2006. 14:45 ] @
STVAR JE CUPAVA NE POSTOJI NITI ( EXCEPT)
postoji samo UNIJA , (INNER, RIGHT , LEFT ) JOIN
AL NE DA MI SE PISATI --> (( A U B) L (A L B) U (A R B))
U-> UNIJA
L > LEFT OUTER JOIN
R-> RIGHT OUTER JOIN
al kada se to treba napisati sa nekoliko pod upita izgubim se brate, oci mi iskapise brojeci zagrade .
valjda moze lakse .
[ chachka @ 03.09.2006. 16:24 ] @
Moguće! M$ gura svoju priču. Nema EXCEPT, ali mislim da ima MINUS u istom značenju.

Ako nema ni MINUS onda možeš da googluješ 'RELATIONAL DIVISION', prvi link, pročitaš tekst i primeniš.

Citat:
Neznalica_sa_ugla: oci mi iskapise brojeci zagrade .

Ne bi kukao da si programirao u LISP-u
[ delalt @ 04.09.2006. 15:58 ] @
Citat:
Neznalica_sa_ugla:
UPIT-15. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji kupuju kod trgovca X sve
djelove koje on prodaje!
UPIT -16. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji sve dijelove koje im trebaju,
kupuju, između ostalog, i kod trgovca X!
BIO BI VEOMA ZAHVALAN NA BILO KAKAVOJ POMOCI

Meni ovdje stvarno nešto nije jasno. Zar se ovi upiti ne mogu riješiti korištenjem WHERE i GROUP BY klauzula?
Ajde, molim te daj primjer iz gornje tabele šta treba da dobiješ iz upita 15, a šta iz upita 16.
Upit 16 je malo zbunjujući...
Za upit 15 ja sam shvatio da tebi treba ovo:
Code:
SELECT KUPAC 
FROM RACUN 
WHERE TRGOVAC = :X 
GROUP BY KUPAC 

Osim ako ne treba naći kupce koji su kupili bar po jedan primjerak od svih ponuđenih dijelova koje taj trgovac prodaje ("sve dijelove koje on prodaje"). Ali bi onda trebala i dodatna tabela o dijelovima i trgovcima. Nije mi jasno?
[ chachka @ 04.09.2006. 16:45 ] @
Ima Neznalica_sa_ugla još tabela!

Nije postovao kompletan DDL svojih BCNF normalizovanih tabela, nije postovao upite do kojih je došao.

Zato sam mu i dao samo uputstvo, pa nek se sam snalazi.

[ Neznalica_sa_ugla @ 05.09.2006. 16:28 ] @
Ovdje je kompl. zadatak sa tablicam i rjesenim upitima
http://www.debian-world.com/neznalica
naravno neki nedostaju , te i treba reseiti

Mislio sam da ne moze bez INTERSECT ,al ......

[Ovu poruku je menjao Neznalica_sa_ugla dana 05.09.2006. u 17:57 GMT+1]
[ chachka @ 05.09.2006. 21:51 ] @
Kada sam rekao da nije poslat DDL, mislio sam na SQL skriptu pomocu koje svako lako sebi moze da kreira bazu o kojoj je rec. Dakle nesto poput
Code:

CREATE TABLE S (
  s_id CHAR(2) NOT NULL,
  sname VARCHAR(10) NOT NULL,
  CONSTRAINT pk_s PRIMARY KEY (s_id)
);

CREATE TABLE P (
  p_id CHAR(2) NOT NULL,
  pname VARCHAR(10) NOT NULL,
  CONSTRAINT pk_p PRIMARY KEY (p_id)
);

CREATE TABLE J (
  j_id CHAR(2) NOT NULL,
  jname VARCHAR(10) NOT NULL,
  CONSTRAINT pk_j PRIMARY KEY (j_id)
);

CREATE TABLE SPJ (
  s_id CHAR(2) NOT NULL,
  p_id CHAR(2) NOT NULL,
  j_id CHAR(2) NOT NULL,
  qty INTEGER NOT NULL,
  CONSTRAINT pk_spj PRIMARY KEY (s_id, p_id, j_id)
);

ALTER TABLE SPJ
  ADD CONSTRAINT fk_spj_s FOREIGN KEY (s_id) REFERENCES S(s_id)
  ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE SPJ
  ADD CONSTRAINT fk_spj_p FOREIGN KEY (p_id) REFERENCES P(p_id)
  ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE SPJ
  ADD CONSTRAINT fk_spj_j FOREIGN KEY (j_id) REFERENCES J(j_id)
  ON DELETE RESTRICT ON UPDATE RESTRICT;

Onda jos dodas test podatke DML skriptom, poput:
Code:

INSERT INTO S (s_id, sname) VALUES ('S1', 'Smith');
INSERT INTO S (s_id, sname) VALUES ('S2', 'Jones');
INSERT INTO S (s_id, sname) VALUES ('S3', 'Blake');
INSERT INTO S (s_id, sname) VALUES ('S4', 'Clark');
INSERT INTO S (s_id, sname) VALUES ('S5', 'Adams');

INSERT INTO P (p_id, pname) VALUES ('P1', 'Nut');
INSERT INTO P (p_id, pname) VALUES ('P2', 'Bolt');
INSERT INTO P (p_id, pname) VALUES ('P3', 'Screw');
INSERT INTO P (p_id, pname) VALUES ('P4', 'Screw');
INSERT INTO P (p_id, pname) VALUES ('P5', 'Cam');
INSERT INTO P (p_id, pname) VALUES ('P6', 'Cog');

INSERT INTO J (j_id, jname) VALUES ('J1', 'Sorter');
INSERT INTO J (j_id, jname) VALUES ('J2', 'Punch');
INSERT INTO J (j_id, jname) VALUES ('J3', 'Reader');
INSERT INTO J (j_id, jname) VALUES ('J4', 'Console');
INSERT INTO J (j_id, jname) VALUES ('J5', 'Collator');
INSERT INTO J (j_id, jname) VALUES ('J6', 'Terminal');
INSERT INTO J (j_id, jname) VALUES ('J7', 'Tape');

INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S1', 'P1', 'J1', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S1', 'P1', 'J4', 700);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J1', 400);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J2', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J3', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J4', 500);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J5', 600);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J6', 400);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P3', 'J7', 800);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S2', 'P5', 'J2', 100);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S3', 'P3', 'J1', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S3', 'P4', 'J2', 500);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S4', 'P6', 'J3', 300);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S4', 'P6', 'J7', 300);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P2', 'J2', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P2', 'J4', 100);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P5', 'J5', 500);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P5', 'J7', 100);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P6', 'J2', 200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P1', 'J4', 1000);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P3', 'J4', 1200);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P4', 'J4', 800);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P5', 'J4', 400);
INSERT INTO SPJ (s_id, p_id, j_id, qty) VALUES ('S5', 'P6', 'J4', 500);

COMMIT;

Ovakvim skriptama dajes strukturu i testne podatke, a ljudi koji ti pokusavaju pomoci se mogu usredsrediti na resavanje problema.
Evo ti odgovor na 15. pitanje upotrebom tehnike na koju sam ti ukazao (za supplier-a S1), a ti probaj sam da uradis 16-to pitanje.
Code:

SELECT spj1.j_id, spj1.s_id
  FROM spj AS spj1
 WHERE spj1.s_id = 'S1'
 GROUP BY spj1.j_id, spj1.s_id
HAVING COUNT(spj1.p_id) = (SELECT COUNT(DISTINCT(spj2.p_id))
                             FROM spj AS spj2
                            WHERE spj1.s_id = spj2.s_id)


Inace, proces kojim si od pocetnih tabela dosao do ovih koje si postovao nije normalizacija, nego KODIRANJE.
Kodirao si boju 'Red' sa kodom 'C1#', a isto tako si tu boju 'Red' mogao da kodiras sa 'C1+', ili 'piros' (na Madjarskom) ili u hexa oblik '0000FF'.
Isto tako si grad 'Rome' kodirao sa 'C2', a mogao si i sa 'RI' ili '15' ili 'Rim'.
I jos jedanput: Izvrseno je kodiranje, a ne normalizacija.

[Ovu poruku je menjao chachka dana 05.09.2006. u 23:04 GMT+1]
[ Neznalica_sa_ugla @ 06.09.2006. 22:45 ] @
U svakom slucaju treba zahvalitu CHACHKA ,je se potrudio i odradio dio mog posla te omogucio da se te tablice lako skinu . Jos jednom hvala . Ali......
doista ne bi htio biti sitnicav i maltretirati ljude ,( nadam se da me tako nedoživljavate ) ali rijesenje koje je ponudio chachka radi , i s malom izmjenom rjesen je i 16 upit , No sta me muci .Chachka je kako s e vidi prebrio
stavke i rekao da u oba skupa moraju biti jednake (15 zadata) vece ili jednake ( 16 zad.) To je u ova dva upita tacno ali takom metodom pribrojavanje elemenata u skupu ne moze se znati sami odnos skupova .
Ta ista metoda prebrojavanja pada u vodu u 13 i 14 zadatku (da li bi pala za 15,16 ako bi se unijelo vise zapisa ???) U svakom slucaju metoda je ok ako u podupitu nema vise skupova sto je nije slucaj u 14 i 15 za koje se ispostavilo da nisu tocni . Naime zadatak 13 uzmimo trgovca s3 -> prodaje delove p3,p4 , trebamo naci kupce koji su kupilu
i p3 i p4 od bilo kojeg kupca , tako je j2 ( kupio p3 od s2 , p4 od s3 trgovci nisu ist) j4 (kupio p3 od s2 , p4 od s5)
ostali kupci nisu kupili OBA ta djela odgovor je j2,j4 , ako prebrojimo elemente po gore navedenoj metodi dobijam sve kupce .Mozda nesto gresim u logici ili tumacenju teksta.
o samoj normalizaciji drugi put .... nadam se vasim komentarima




[ chachka @ 09.09.2006. 19:50 ] @
Dakle problem su dva upita:
13. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji, između ostalog, kupuju sve dijelove koje trgovac X prodaje!
14. Pročitaj šifru trgovca (X). Ispiši šifre kupaca koji kupuju samo one dijelove koje trgovac X prodaje!

Opet mi na pamet jedino pada rešenje sa prebrojavanjem skupova :)

13.
Imamo dva skupa
K = skup delova koje kupuje kupac
T = skup delova koje prodaje trgovac X
Zadatak se može iskazati i kao:
Skup delova koje prodaje trgovac X je podskup skupa delova koje kupuje kupac.
odnosno
T JE_PODSKUP K
ili
T UNIJA K = K
a ovo implicira da je kardinalnost unije skupova T i K jednaka kardinalnosti skupa K.

Zapisano SQL-om za X = 'S3':
Code:

SELECT K1.j_id
  FROM spj AS K1
 GROUP BY K1.j_id
HAVING (SELECT COUNT(DISTINCT(u.p_id))
          FROM (SELECT T.p_id AS p_id
                  FROM spj AS T
                 WHERE T.s_id = 'S3'
                 UNION
                SELECT K2.p_id AS p_id
                  FROM spj AS K2
                 WHERE K2.j_id = K1.j_id) AS u)
       =
       COUNT(K1.p_id)


14.
Slično upitu pod 13 imamo dva skupa
K = skup delova koje kupuje kupac
T = skup delova koje prodaje trgovac X
Zadatak se može iskazati i kao:
Skup delova koje kupuje kupac je podskup skupa delova koje prodaje trgovac X.
odnosno
K JE_PODSKUP T
ili
T UNIJA K = T
a ovo implicira da je kardinalnost unije skupova T i K jednaka kardinalnosti skupa T.

Zapisano SQL-om za X = 'S2' ('S2' se pojavljuje na dva mesta!):
Code:

SELECT K1.j_id
  FROM spj AS K1
 GROUP BY K1.j_id
HAVING (SELECT COUNT(DISTINCT(u.p_id))
          FROM (SELECT T.p_id AS p_id
                  FROM spj AS T
                 WHERE T.s_id = 'S2'
                 UNION
                SELECT K2.p_id AS p_id
                  FROM spj AS K2
                 WHERE K2.j_id = K1.j_id) AS u)
       =
       (SELECT COUNT(DISTINCT(T.p_id))
          FROM spj AS T
         WHERE T.s_id = 'S2')

Upiti su testirani na PostgreSQL 8.1 serveru.
[ Neznalica_sa_ugla @ 09.09.2006. 23:10 ] @
Pogledao sam resenja , svakako hvala na trudu , ali upiti daju druga rešenja uglavnom sve kupce za sve rgovce .

rešenaj su 13 )
s1- >j1 ,j4
s2 ->j2,j4,j5,j7
s3-->j2,j4
s4-> j2,j3,j4,j7
s5-> j4
14)
s1-->o/o prazan
s2-->j5,j6
s3-->o/o
s4 --> o/o
s5--> j1, j2, j3 ,j4 ,j5, j6

ali ja to nikao d a dobijem kroz upit


[ chachka @ 09.09.2006. 23:35 ] @
13.
Moja greška nastala pokušajem skraćivanja SQL upita, a ispravan upit je
Code:

SELECT K1.j_id
  FROM spj AS K1
 GROUP BY K1.j_id
HAVING (SELECT COUNT(DISTINCT(u.p_id))
          FROM (SELECT T.p_id AS p_id
                  FROM spj AS T
                 WHERE T.s_id = 'S5'
                 UNION
                SELECT K2.p_id AS p_id
                  FROM spj AS K2
                 WHERE K2.j_id = K1.j_id) AS u)
       =
       (SELECT COUNT(DISTINCT(K3.p_id))
          FROM spj AS K3
         WHERE K3.j_id = K1.j_id)


14.
Citat:
Neznalica_sa_ugla:
14)
s3-->o/o

Prodavac S3 prodaje delove P3 i P4, a kupac J6 kupuje samo deo P3. Znači J6 kupuje samo delove (P3) koje prodaje S3. Dakle
S3 -->J6
što moj SQL upit i daje. Slično je onda:
S5-->J1, J2, J3, J4, J5, J6, J7

To je moja interpretacija reči 'SAMO', jer zadatak ne glasi:
Ispiši šifre kupaca koji kupuju ISKLJUČIVO one dijelove koje trgovac X prodaje!

Za mene postoji razlika između ISKLJUČIVO i SAMO.

[ Neznalica_sa_ugla @ 09.09.2006. 23:59 ] @
Razlicito tumacimo zadatak . Ja sam ovo izcitavao : Koji kupac kupuje SAMO one ( ne neke druge ) djelove, od BILO KOJEG trgovac i to UPRAVO TE djelove koje trgovac X prodaje .
Kako znati istinu ???? Ako bi tumacili zadatak kao ti vidis stavr onda postoji daleko jednostavnije rešenje , no bojim se da nam se podkrada gresaka u citanj u ???
[ chachka @ 10.09.2006. 00:19 ] @
Smatram tumačenje ispravnim. Postuj rešenje pošto meni kao što rekoh ništa drugo nepada na pamet.

Inače, drugačije tumačenje se može uraditi (opet prebrojavanjem :))) pomoću
(K JE_PODSKUP T) I (T JE_PODSKUP K)
ekvivalentno
(K UNIJA T = T) I (T UNIJA K = K)
implicira
(KARDINALNOST(K UNIJA T) = KARDINALNOST(T)) I (KARDINALNOST(T UNIJA K) = KARDINALNOST(K))
[ Neznalica_sa_ugla @ 10.09.2006. 00:26 ] @
OVAKO RESENJE SAM DOBI JOS U POCETKU
14))

SELECT DISTINCT SPJ.J#
FROM SPJ,J
WHERE ( (SPJ.J#= J.[j#]) AND ( SPJ.P# IN ( SELECT DISTINCT SPJ.P# FROM SPJ WHERE ( SPJ.S#=@SIF_TRGOVAC) )))


ali misljenje mog ( mentora ) bilo je drugacije . pogledaj d a li ovo daje istovetna rešenja kao i tvoje rešenje
http://www.cs.arizona.edu/peop...n/research/divpresentation.pdf
[ chachka @ 10.09.2006. 08:20 ] @
Tvoj upit odgovara zadatku: Prikaži sve kupce koji kupuju BAREM JEDAN deo kojeg prodaje trgovac X, a deo kupuju od bilo koga. Tu nigde nema reči 'samo'.

Hvala na linku, ali mi nije jasna njegova veza sa mišljenjem tvog mentora (Tvoj mentor je autor prezentacije?).
[ Neznalica_sa_ugla @ 10.09.2006. 15:15 ] @
Objasnjenej u privatnoj poruci