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.