Published on

April 9, 2001

Comprendre les sous-requêtes dans SQL Server

Les sous-requêtes sont un outil puissant dans SQL Server qui peut être utilisé pour récupérer des données à partir d’une ou plusieurs tables. Elles vous permettent d’effectuer des requêtes complexes et de récupérer des informations spécifiques en fonction de certaines conditions. Dans cet article, nous explorerons le concept de sous-requêtes et discuterons de leur utilisation efficace dans vos requêtes SQL Server.

Le Problème

Récemment, j’ai rencontré un problème où une sous-requête se comportait étrangement. Un développeur m’a demandé la différence entre deux requêtes qui semblaient similaires. Cependant, lorsqu’elles étaient exécutées, l’une des requêtes produisait une erreur tandis que l’autre renvoyait le résultat attendu.

Voici les deux requêtes :

declare @this_id int
set @this_id = 100
select sum(ol.price)
 from OrdLineDtl od, OrdLine ol
 where od.TypID = ( select TypID
					 from Attr
					 where AttrName = 'Item'
					)
 and od.AttrVal = @this_id
 and od.OrdLineID = ol.OrdLineID

go
declare @this_id int
set @this_id = 100
select sum(oi.price)
from OrdLineDtl od, OrderLine ol
where od.TypID = 53
	and od.AttrVal = @this_id
	and od.OrdLineID = ol.OrdLineID

La première requête a produit une erreur, tandis que la deuxième requête a renvoyé le résultat attendu. Le message d’erreur indiquait une erreur de syntaxe lors de la conversion d’une valeur varchar en une colonne int.

L’Analyse

Pour comprendre le problème, nous devons analyser le schéma des tables impliquées :

Create Table Attr
(  TypID  int,
   AttrName  char(50)
)

Create Table OrdLine
(  OrderItemID	int,
   ProductCode varchar( 50),
   Price money
)

Create Table OrderLineDtl
(  OrderItemID	int,
   TypID int,
   AttrVal varchar( 50)
)

En analysant le schéma, nous pouvons voir que l’AttrID de 53 ne correspond pas à l’AttrName de ‘Item’. Ce désaccord a causé l’échec de la première requête, car elle essayait de convertir une valeur varchar en une colonne int.

La Solution

Pour résoudre le problème, nous devons modifier la première requête pour utiliser la valeur correcte de TypID. Au lieu d’utiliser une sous-requête pour récupérer le TypID, nous pouvons directement spécifier la valeur de 53 dans la requête :

declare @this_id int
set @this_id = 100
select sum(ol.price)
 from OrdLineDtl od, OrdLine ol
 where od.TypID = 53
 and od.AttrVal = @this_id
 and od.OrdLineID = ol.OrdLineID

En apportant cette modification, la requête s’exécutera maintenant avec succès et renverra le résultat attendu.

Conclusion

Les sous-requêtes sont un outil précieux dans SQL Server qui peuvent vous aider à récupérer des données spécifiques en fonction de certaines conditions. Cependant, il est important de s’assurer que les sous-requêtes sont construites correctement et que les valeurs utilisées dans les sous-requêtes correspondent aux colonnes correspondantes dans les tables. En comprenant les concepts des sous-requêtes et en analysant les problèmes qui se posent, vous pouvez utiliser efficacement les sous-requêtes dans vos requêtes SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.