Вы находитесь на странице: 1из 2

Principes de base des sous-requtes

SQL Server 2008 R2


Autres versions

2 sur 6 ont trouv cela utile - valuez ce sujet


Une sous-requte est une requte qui est imbrique dans une instruction SELECT,
INSERT, UPDATE ou DELETE, ou dans une autre sous-requte. Une sous-requte
peut tre utilise partout o une expression est autorise. Dans l'exemple
suivant, une sous-requte est utilise comme expression de colonne
appele MaxUnitPrice dans une instruction SELECT.
USE AdventureWorks2008R2;
GO
SELECT Ord.SalesOrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet
WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice
FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord
Une sous-requte est galement appele requte interne ou slection
interne et l'instruction qui la contient est aussi appele requte externe ou
slection externe .
Il est souvent possible d'exprimer sous la forme d'une jointure une instruction
Transact-SQL qui contient une sous-requte. D'autres questions peuvent
uniquement tre poses par le biais de sous-requtes. Dans Transact-SQL, les
performances ne varient gnralement pas, que vous utilisiez une instruction
comportant une sous-requte ou que vous ayez recours une syntaxe
smantiquement quivalente qui n'en contient pas. Toutefois, lorsque vous devez
vrifier l'existence, une jointure offre de meilleures performances. En effet, la
requte imbrique doit tre traite pour chaque rsultat de la requte externe de
faon liminer les doublons. Dans de tels cas, une jointure donnera de meilleurs
rsultats. L'exemple suivant prsente une sous-requte et une jointure SELECT
qui retournent le mme ensemble de rsultats :
/* SELECT statement built using a subquery. */
SELECT Name
FROM AdventureWorks2008R2.Production.Product
WHERE ListPrice =
(SELECT ListPrice
FROM AdventureWorks2008R2.Production.Product
WHERE Name = 'Chainring Bolts' );
/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1. Name
FROM AdventureWorks2008R2.Production.Product AS Prd1
JOIN AdventureWorks2008R2.Production.Product AS Prd2
ON (Prd1.ListPrice = Prd2.ListPrice)
WHERE Prd2. Name = 'Chainring Bolts';
Une sous-requte imbrique dans l'instruction SELECT externe comporte les
lments suivants :
une instruction SELECT rgulire constitue des lments standard d'une
liste de slection ;

une clause FROM rgulire comportant les noms d'une ou plusieurs tables
ou vues ;
une clause WHERE facultative ;
une clause GROUP BY facultative ;
une clause HAVING facultative.
La requte SELECT d'une sous-requte se place toujours entre parenthses. Elle
ne peut pas contenir de clause COMPUTE ou FOR BROWSE et peut inclure une
clause ORDER BY uniquement lorsqu'une clause TOP est galement spcifie.
Une sous-requte peut tre imbrique dans une clause WHERE ou HAVING d'une
instruction externe SELECT, INSERT, UPDATE, DELETE ou dans une autre sousrequte. Vous pouvez aller jusqu' 32 niveaux d'imbrication mais cette limite
dpend de la mmoire disponible et de la complexit des autres expressions
constituant la requte. Les requtes individuelles, pour leur part, n'acceptent pas
toujours 32 niveaux d'imbrication. Une sous-requte peut apparatre tout
endroit o une expression est autorise, condition de ne retourner qu'une seule
valeur.
Si une table apparat uniquement dans une sous-requte et pas dans la requte
externe, les colonnes de cette table ne peuvent pas figurer dans les rsultats (la
liste SELECT de la requte externe).
Les instructions contenant une sous-requte se prsentent gnralement sous
une des formes suivantes :
WHERE expression [NOT] IN (subquery)
WHERE expression comparison_operator [ANY | ALL] (subquery)
WHERE [NOT] EXISTS (subquery)
Dans certaines instructions Transact-SQL, la sous-requte peut tre value
comme s'il s'agissait d'une requte indpendante. Thoriquement, les rsultats
de la sous-requte viennent s'insrer dans la requte externe (bien que ce ne soit
pas ncessairement comme cela que Microsoft SQL Server traite en ralit les
instructions Transact-SQL comportant des sous-requtes).
Il existe trois sous-requtes de base :
les sous-requtes qui oprent sur des listes, introduites par IN ou par un
oprateur de comparaison modifi par ANY ou ALL ;
les sous-requtes introduites par un oprateur de comparaison non modifi
et qui doivent retourner une valeur unique ;
les sous-requtes introduites par EXISTS qui constituent des tests
d'existence.

Вам также может понравиться