Teste si Probleme SQL

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
patricia
Mesaje:82

Teste si Probleme SQL

Am o lista de probleme care mi se par greoaie, problema e ca nu am voie sa le rezolv decat cu SQL, nu am voie sa folosesc alt limbaj ca PHP sau altceva.

Baza de date are structura:

Cod: Selectaţi tot

CREATE TABLE vanzari ( 	
	cods	NUMBER(3), 	
	codp	NUMBER(3), 	
	cant	NUMBER(5) ) 	
/
--	cods	cod sectie
--	codp	cod produs
--	cant	cantitatea vinduta
/
CREATE TABLE sectii (		
	cods NUMBER(3), 
	den  CHAR(10), 
	etaj NUMBER(2))
/

-- nomenclatorul de produse

DROP TABLE produse
/
CREATE TABLE produse (			
	codp	NUMBER(3), 
	den	CHAR(20), 
	tip	CHAR(2), 
	cul	CHAR(15), 
	pret	NUMBER(10)) 	
/
--	cul	culoare 

-- nomenclatorul de furnizori

/
CREATE TABLE furnizori (		
	codf	NUMBER(3), 		
	numef	CHAR(20))		
/
-- codf		cod furnizor
-- numef	denumire

-- produsele furnizate de furnizori unei anumite sectii

CREATE TABLE furnizeaza	(		
	codf	NUMBER(3), 
	cods	NUMBER(3), 	
	codp	NUMBER(3), 
	cant	NUMBER(5))
/
Enunturi:
Scrieţi interogări pentru a determina:

1. Produsele furnizate de toţi furnizorii ce furnizează cel puţin un produs de tip 'A' vreunei secţii( un astfel de produs să fie furnizat de TOŢI furnizorii cu proprietatea de mai sus ).

2. Produsele furnizate de toţi furnizorii ce furnizează toate produsele de tip 'A'( în lista produselor furnizate de fiecare dintre aceşti furnizori se află toate produsele de tip ‘A’ iar produsele care trebuie determinate sînt acele produse care sint furnizate de FIECARE astfel de furnizor ).

3. Perechile <furnizor, secţie> pentru care acea secţie vinde toate produsele furnizate ei de acel furnizor( orice produs care îi este furnizat de acel furnizor apare în lista ei de vînzări ).

4. Produsele furnizate de toţi furnizorii tuturor secţiilor( un astfel de produs este furnizat de fiecare furnizor fiecărei secţii ).

5. Furnizorii ce furnizează toate produsele de tip 'A' unei aceleiaşi secţii de la etajul 2( pentru un astfel de furnizor există o secţie de la etajul 2 astfel încît in lista produselor furnizate ei de acest furnizor se află toate produsele de tip ‘A’ ).

6. Furnizorii( numele lor ) ce îndeplinesc proprietatea că furnizează cel puţin un produs tuturor secţiilor care îl au ca furnizor pe cel cu identificatorul 1.

7. Secţiile care satisfac proprietatea că fiecare produs furnizat lor este furnizat cel puţin încă unei alte secţii.

8. Produsele furnizate de acei furnizori care furnizează cel puţin un produs fiecărei secţii( trebuie determinate acele produse care apar în lista produselor furnizate de măcar un furnizor cu această proprietate ).

9. Numărul de perechi <furnizor, secţie> cu proprietatea că furnizorul furnizează cel puţin un produs de tip 'A' acelei secţii.

10. Produsele furnizate de toţi furnizorii ce furnizează cel puţin două produse de tipul 'A' ( trebuie determinate acele produse care apar în lista produselor furnizate de TOŢI furnizorii cu această proprietate).

patricia Mesaje:82
Solutia poate fi verificata pe datele pe care le-am dat pentru baza de date.

Raspuns la intrebarea 1:
/* Creeaza tabelul in care vor fi introdusi toti furnizorii ce furnizeaza cel putin un produs de tip A */

Cod: Selectaţi tot

CREATE  TABLE FURNIZORI_CU_PROP_X(COD_FURNIZOR INTEGER);
/* Selecteaza furniorii ce furnizeaza cel putin un produs de tip A si ii introduce in tabelul furnizori_cu_prop_x */

Cod: Selectaţi tot

INSERT INTO FURNIZORI_CU_PROP_X(COD_FURNIZOR) SELECT DISTINCT COD_FURNIZOR FROM FURNIZEAZA
 WHERE COD_PRODUS IN(SELECT COD_PRODUS FROM PRODUSE WHERE TIP_PRODUS='A');

Cod: Selectaţi tot

SELECT * FROM FURNIZORI_CU_PROP_X;
/* Selectam codurile produselor furnizate de toti furnizorii ce furnizeaza cel putin un produs de tip A
Pentru un astfelde produs numarul total al furnizorilor cu propreietatea X (adica furnieaza cel putin un produs de
tip A) care se regasesc printre produsului in cauza trebuie sa fie egal cu numarul total al furnizorilor
cu proprietatea X */

Cod: Selectaţi tot

SELECT DISTINCT COD_PRODUS FROM PRODUSE P WHERE (SELECT COUNT(*) FROM FURNIZORI_CU_PROP_X 
WHERE COD_FURNIZOR IN 
(SELECT DISTINCT COD_FURNIZOR FROM FURNIZEAZA WHERE COD_PRODUS=P.COD_PRODUS))=
(SELECT COUNT(*) FROM FURNIZORI_CU_PROP_X);
O sa afisaeze 3,5 si 8;