Udostępnij za pośrednictwem


Skorelowanych podkwerendy

Wielu kwerend może zostać oceniony przez wykonywanie podzapytanie raz i podstawianie wartości lub wartości wynikowej w klauzula WHERE, zewnętrznej kwerendy.W kwerendach zawierających skorelowane podzapytanie (znane również jako podkwerendy powtarzanej), podkwerendy zależy od zewnętrznej kwerendy dla jego wartości.Oznacza to, że podzapytanie jest wykonywane wielokrotnie, raz dla każdego wiersza, wybranego przez kwerendę zewnętrznego.

Ta kwerenda pobiera jedno wystąpienie każdego pracownika imienia i nazwiska, dla którego premii w SalesPerson Tabela jest 5000 i dla którego numery identyfikacyjne pracowników są zgodne Employee i SalesPerson tabele.

USE AdventureWorks2008R2;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID 
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000.00 IN
    (SELECT Bonus
    FROM Sales.SalesPerson sp
    WHERE e.BusinessEntityID = sp.BusinessEntityID) ;
GO

Oto zestaw wyników.

LastName FirstName BusinessEntityID

-------------------------- ---------- ------------

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 row(s) affected)

Poprzednie podzapytanie w tej instrukcja nie oceniane niezależnie od zewnętrznej kwerendy.Potrzebuje wartość dla Employee.BusinessEntityID, ale wartość ta zmienia się jak SQL Server sprawdza, czy w różnych wierszach w Employee.

Jest dokładnie jak ocenić tę kwerendę: SQL Serveruzna za każdy wiersz Employee tabela do włączenia do wyniki przez podstawianie wartości w każdym wierszu wewnętrzne kwerendy.Na przykład jeśli SQL Server najpierw sprawdza, czy wiersz Syed Abbas, zmienna Employee.BusinessEntityID przyjmuje wartość 285, które SQL Server podstawia w wewnętrzne kwerendy.

USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;

Wynik jest równy 0 (Syed Abbas nie otrzymał premię, ponieważ nie jest on sprzedawcę), dlatego wynikiem kwerendy zewnętrzne:

USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID 
WHERE 5000 IN (0.00)

Ponieważ jest to FAŁSZ, wiersz Syed Abbas nie znajduje wyniki.Przejść przez tą samą procedurą z wierszem dla Pamela Ansman-Wolfe.Zobaczysz, że ten wiersz jest uwzględniony w wyniki.

Skorelowanych podkwerend można również uwzględnić funkcja zwracająca tabelęs w klauzula FROM przez odwoływanie się do kolumn z tabela zewnętrznej kwerendy jako argumentu funkcja zwracająca tabelę.W tym przypadek dla każdego wiersza, zewnętrznej kwerendy funkcja zwracająca tabelę jest oceniane zgodnie z podzapytanie.

Zobacz także

Koncepcje