Skaláris vagy többértékű al lekérdezések használata
A skaláris alquery egy külső lekérdezés belső SELECT utasítása, amelyet egyetlen érték visszaadására írnak. A skaláris allekérdezések bárhol használhatók egy külső T-SQL-utasításban, ahol engedélyezett egy egyértékű kifejezés – például SELECT záradékban, WHERE záradékban, HAVING záradékban vagy akár FROM záradékban. Adatmódosítási utasításokban is használhatók, például UPDATE vagy DELETE.
A többértékű al lekérdezések, ahogy a név is sugallja, több sort is visszaadhatnak. Ezek azonban továbbra is egyetlen oszlopot adnak vissza.
Skaláris alqueries
Tegyük fel, hogy az utolsó leadott rendelés adatait szeretné lekérni azzal a feltételezéssel, hogy az a legmagasabb SalesOrderID értékkel rendelkező.
A legmagasabb SalesOrderID érték megkereséséhez használhatja a következő lekérdezést:
SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader
Ez a lekérdezés egyetlen értéket ad vissza, amely a SalesOrderHeader táblában lévő OrderID legmagasabb értékét jelzi.
A rendelés részleteinek lekéréséhez előfordulhat, hogy a SalesOrderDetails táblát a fenti lekérdezés által visszaadott érték alapján kell szűrnie. Ezt a feladatot úgy hajthatja végre, hogy a lekérdezésbe ágyazva lekéri a maximális SalesOrderID értéket egy lekérdezés WHERE záradékában, amely lekéri a rendelés részleteit.
SELECT SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader);
Skaláris alquery írásához vegye figyelembe az alábbi irányelveket:
- Ha egy lekérdezést allekérdezésként szeretne jelölni, zárójelbe kell tenni.
- A Transact-SQL több albekérdezésszintet is támogat. Ebben a modulban csak kétszintű lekérdezéseket (egy belső lekérdezést egy külső lekérdezésen belül) veszünk figyelembe, de legfeljebb 32 szint támogatott.
- Ha az alquery nem ad vissza sorokat (üres készletet), az alquery eredménye NULL. Ha a forgatókönyvben nem lehet sorokat visszaadni, győződjön meg arról, hogy a külső lekérdezés az egyéb várt eredmények mellett a NULL értéket is képes kezelni.
- A belső lekérdezésnek általában egyetlen oszlopot kell visszaadnia. Ha több oszlopot jelöl ki egy alkérdezésben, az szinte mindig hiba. Az egyetlen kivétel az, ha az al lekérdezés a EXISTS kulcsszóval van bevezetve.
A skaláris alkérdezések bárhol használhatók olyan lekérdezésekben, ahol érték várható, beleértve a SELECT listát is. Kiterjeszthetjük például azt a lekérdezést, amely a legutóbbi rendelés adatait kéri le, hogy tartalmazza a megrendelt cikkek átlagos mennyiségét, így összehasonlíthatjuk a legutóbbi megrendelésben megrendelt mennyiséget az összes rendelés átlagával.
SELECT SalesOrderID, ProductID, OrderQty,
(SELECT AVG(OrderQty)
FROM SalesLT.SalesOrderDetail) AS AvgQty
FROM SalesLT.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM SalesLT.SalesOrderHeader);
Többértékű al lekérdezések
A többértékű alkérdezés jól használható az EREDMÉNYEK IN operátorral történő visszaadására. Az alábbi hipotetikus példa a CustomerID, SalesOrderID értékeket adja vissza az ügyfelek által Kanadában leadott összes rendeléshez.
SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE CustomerID IN (
SELECT CustomerID
FROM Sales.Customer
WHERE CountryRegion = 'Canada');
Ebben a példában, ha csak a belső lekérdezést hajtaná végre, a rendszer a CustomerID értékek egy oszlopát adja vissza, amely egy sort tartalmaz minden kanadai ügyfélhez.
Sok esetben a többértékű al lekérdezések egyszerűen írhatók illesztések használatával. Íme például egy lekérdezés, amely illesztés használatával ugyanazt az eredményt adja vissza, mint az előző példában:
SELECT c.CustomerID, o.SalesOrderID
FROM Sales.Customer AS c
JOIN Sales.SalesOrderHeader AS o
ON c.CustomerID = o.CustomerID
WHERE c.CountryRegion = 'Canada';
Hogyan dönti el tehát, hogy több táblát tartalmazó lekérdezést szeretne-e JOIN-ként vagy alkettőként írni? Néha csak attól függ, hogy mi a kényelmesebb. A legtöbb könnyen JOIN-ké konvertálható beágyazott lekérdezés valójában belső JOIN-ra lesz konvertálva. Az ilyen lekérdezések esetében nincs valódi különbség a lekérdezés írásában az egyik útról a másikra.
Ne feledje, hogy beágyazott lekérdezés használatakor az ügyfélnek visszaadott eredmények csak a külső lekérdezés oszlopait tartalmazhatják. Ha tehát mindkét táblából oszlopokat kell visszaadnia, akkor a lekérdezést egy JOIN használatával kell megírnia.
Végül vannak olyan helyzetek, amikor a belső lekérdezésnek sokkal bonyolultabb műveleteket kell végrehajtania, mint a példánkban szereplő egyszerű lekérések. Az összetett al lekérdezések illesztéssel történő újraírása nehéz lehet. Sok SQL-fejlesztő úgy találja, hogy az al lekérdezések bonyolult feldolgozáshoz működnek a legjobban, mivel lehetővé teszi a feldolgozás kisebb lépésekre bontását.