Subinterogari

Informatii despre cum se utilizeaza Microsoft Access 2007. Baze de date, Interogari, Formulare, Rapoarte, etc
Închis
Corvin
Mesaje: 80
Membru din: Vin Apr 02, 2010 5:47 am

Subinterogari

Mesaj de Corvin » Joi Apr 08, 2010 6:21 am

Buna dimineata!

Cum se pot crea subinterogari si daca este posibil sa-mi dati si anumite exemple v-as fi recunoscator.
Multumesc anticipat!

valy

Re: Subinterogari

Mesaj de valy » Joi Apr 08, 2010 8:33 am

Prin subinterogari se intelege, de regula, includerea unei instructiuni SELECT in cadrul altei instructiuni SQL. De obicei, subinterogarile sunt incluse in clauza WHERE a unei instructiuni SQL, dar pot aparea si in clauza SELECT.
In grila QBE se poate introduce o subinterogare fie in campul CRITERIA, fie in campul FIELD.
Iata ce se poate realiza cu ajutorul subinterogarilor:
1. Sa verificam daca anumite valori se afla printre datele continute intr-o tabela sau returnate de o interogare. Sintaxa este, in mare, urmatoarea:

Cod: Selectaţi tot

expresie [NOT] IN (subinterogare)
Sa presupunem ca dorim sa vedm profesorii (impreuna cu titlurile si catedrele lor) care au salariul mai mare de 2400 lei. Pentru aceasta, putem folosi ori prima dintre interogarile de mai jos (care contine o subinterogare), ori pe cea de-a doua (bazata pe un join).

Cod: Selectaţi tot

SELECT Nume, IdTitlu, Catedra
FROM Profesor
WHERE IdTitlu IN (SELECT IdTitlu FROM Titlu
WHERE Salariu >=2400);
sau

Cod: Selectaţi tot

SELECT Nume, IdTitlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu >=2400;
Acest tip de subinterogare nu poate returna decat o singura coloana, altfel, se va obtine o eroare.
Pentru a verifica daca anumite valori nu sunt intr-o lista se foloseste operatorul NOT.
2. Sa comparam o valoare cu datele returnate de o interogare. Sintaxa este:

Cod: Selectaţi tot

comparatie [{ANY|SOME|ALL}] (subinterogare)
Si in acest caz, subinterogarea nu trebuie sa returneze decat o singura coloana.
Sa presupunem ca dorim sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat al profesorului "Dr.Excel". :D Pentru aceasta, putem folosi urmatoarea interogare:

Cod: Selectaţi tot

SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu > (SELECT Salariu
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Nume = "Dr.Excel");
In cazul in care am dori sa facem comparatii cu mai multe valori returnate de o subinterogare, putem utiliza urmatoarele predicate:
- ANY sau SOME: comparatia este adevarata daca exista cel putin o valoare returnata de subinterogare pentru care ea sa fie adevarata;
- ALL: comparatia este adevarata daca ea este adevarata pentru orice valoare returnata de subinterogare.
Daca am dori sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat cel putin un alt profesor (deci care nu au salariul cel mai mic), am putea scrie:

Cod: Selectaţi tot

SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN  Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu > ANY (SELECT Salariu FROM Titlu);
Pe de alta parte, daca ne intereseaza numele, titlul si catedra profesorilor care au salariul mai mare decat orice alt profesor, am scrie:

Cod: Selectaţi tot

SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu >= ALL (SELECT Salariu FROM Titlu);
3. Se pot stabili criterii in functie de existenta inregistrarilor returnate de o subinterogare. Pentru aceasta se va folosi predicatul EXISTS in cadrul sintaxei:

Cod: Selectaţi tot

[NOT] EXISTS (subinterogare)
Subinterogarile prezentate mai sus au fost independente de interogarea "exterioara" (cea care le folosea). Putem crea insa si subinterogari "corelate" cu interogarea exterioara prin intermediul unei coloane de legatura (subinterogarile care folosesc predicatul EXISTS, de obicei sunt corelate).
Sa presupunem ca dorim sa aflam care sunt cursurile la care nu s-a inscris niciun student. Pentru aceasta, om folosi o subinterogare ce contine predicatul NOT EXISTS:

Cod: Selectaţi tot

SELECT IdCurs, Dnumire
FROM Curs
WHERE NOT EXISTS (SELECT  * FROM Curs_Student
WHERE IdCurs=Curs.IdCurs);
Subinterogarea de mai sus este corelata deoarece utilizeaza in clauza WHERE date din interogarea exterioara. ;)

Închis

Înapoi la “Intrebari despre Access 2007”