Conditions JOIN de SQL Server et instructions CASE : un examen plus approfondi
Lorsque vous travaillez avec les vues système de Microsoft SQL Server 2008 R2, comme sys.partitions
et sys.allocation_units
, la relation entre elles dépend souvent de la valeur sys.allocation_units.type
. Une approche courante pour joindre ces tables pourrait impliquer une instruction CASE
dans la condition JOIN
.
Examinons ce scénario : la connexion de sys.indexes
, sys.partitions
et sys.allocation_units
nécessite une jointure conditionnelle basée sur allocation_units.type
. Une première tentative pourrait ressembler à ceci :
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
Ceci entraîne cependant une erreur de syntaxe. Le problème vient du fait que les instructions CASE
dans SQL Server produisent des valeurs scalaires, et non des instructions exécutables. Ils ne peuvent pas contrôler directement la comparaison d'égalité dans la clause JOIN
.
La solution : évaluation booléenne avec CASE
Pour résoudre ce problème, nous devons restructurer l'instruction CASE
pour renvoyer une valeur booléenne (1 pour vrai, 0 pour faux) qui peut ensuite être comparée :
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
En utilisant AND
dans les clauses WHEN
et en comparant l'expression CASE
résultante à 1, nous créons effectivement une jointure conditionnelle. Cela démontre que même si les instructions CASE
sont puissantes, leur utilisation dans les conditions JOIN
nécessite un examen attentif de leur type de retour et la nécessité d'une évaluation booléenne explicite. L'affectation directe ou les tests d'égalité au sein de l'instruction CASE
elle-même au sein d'un JOIN
ne sont pas pris en charge.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!