Skaláris vagy többértékű al lekérdezések használata

Befejeződött

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.