Caractère inconnu dans l'instruction SQL
-
03-07-2019 - |
Question
C’est une sorte de question pour les débutants dans SQL, je pense, mais voilà.
J'ai créé une requête SQL (SQL Server 2005) à partir d'un exemple de fonction définie par l'utilisateur:
SELECT
CASEID,
GetNoteText(CASEID)
FROM
(
SELECT
CASEID
FROM
ATTACHMENTS
GROUP BY
CASEID
) i
GO
La fonction UDF fonctionne très bien (elle concatène les données de plusieurs lignes dans une table liée, si cela compte vraiment), mais je suis confus au sujet de l'option "i". après la clause FROM. La requête fonctionne bien avec le i mais échoue sans elle. Quelle est la signification de "i"?
EDIT: Comme Joel l’a noté ci-dessous, ce n’est pas un mot clé
La solution
Lorsque vous utilisez une sous-requête dans la clause FROM, vous devez lui attribuer un nom. Étant donné que le nom ne vous concerne pas vraiment, vous choisissez souvent un mot simple comme "i" ou "a". Mais vous pouvez y inscrire le nom de votre choix. Le mot "i" n'a aucune importance, et ce n'est certainement pas un mot clé.
Si vous avez une requête très complexe, vous devrez peut-être joindre votre sous-requête à d'autres requêtes ou tables. Dans ce cas, le nom devient plus important et vous devez choisir quelque chose de plus significatif.
Autres conseils
Le i nomme la (sous-requête), qui est requise et également nécessaire pour des jointures ultérieures.
Vous devez préfixer les colonnes de la requête externe avec le nom de la sous-requête lorsqu'il existe des noms de colonnes en conflit entre les tables jointes, par exemple:
SELECT
c.CASEID, c.CASE_NAME,
a.COUNT AS ATTACHMENTSCOUNT, o.COUNT as OTHERCOUNT,
dbo.GetNoteText(c.CASEID)
FROM CASES c
LEFT OUTER JOIN
(
SELECT
CASEID, COUNT(*) AS COUNT
FROM
ATTACHMENTS
GROUP BY
CASEID
) a
ON a.CASEID = c.CASEID
LEFT OUTER JOIN
(
SELECT
CASEID, COUNT(*) AS COUNT
FROM
OTHER
GROUP BY
CASEID
) o
ON o.CASEID = c.CASEID
Le " i " donne à votre instruction select un nom de table effectif. Cela pourrait également être écrit (je pense - je ne suis pas un gars de MSSQLServer) comme "AS i".
Comme d'autres l'ont indiqué, il s'agit d'un alias de nom de table pour la sous-requête.
En dehors de la sous-requête, vous pouvez utiliser i.CASEID pour faire référence aux résultats de la sous-requête.
Ce n'est pas très utile dans cet exemple, mais lorsque vous avez plusieurs sous-requêtes, c'est un outil de désambiguïsation très important.
Bien que, je choisirais un meilleur nom de variable. Même " temp " c'est mieux.
Le i nomme votre sous-requête de sorte que si vous avez une requête complexe comportant de nombreuses sous-requêtes et que vous ayez besoin d'accéder aux champs, vous pouvez le faire de manière non ambiguë.
Il est judicieux de donner à vos sous-requêtes davantage de noms descriptifs pour éviter toute confusion lorsque vous commencez à écrire des requêtes plus longues. Il n’ya rien de pire que de devoir faire défiler une longue instruction SQL car vous avez oublié laquelle i. id est le bon ou la table / requête c.name est récupérée.
La leçon à retenir est de penser à la personne qui héritera de votre code. Comme d’autres l’ont dit, si le code avait été écrit comme ceci:
SELECT DT1.CASEID, GetNoteText(DT1.CASEID)
FROM (
SELECT CASEID
FROM ATTACHMENTS
GROUP BY CASEID
) AS DT1 (CASEID);
alors il y a une chance accrue que le lecteur l'ait compris et puisse même relever "DT1" en faisant allusion à un "tableau dérivé".
" Table dérivée " est un terme technique pour utiliser une sous-requête dans la clause FROM.
La syntaxe de la documentation en ligne de SQL Server montre que alias_table n'est pas facultatif dans ce cas; " table_alias " n'est pas entre crochets et, conformément aux conventions de syntaxe Transact-SQL, les éléments entre crochets sont facultatifs. Le mot clé " AS " est facultatif, car entre parenthèses ...
& nbsp; & nbsp; & nbsp; table_dérivée [AS] alias de table [(alias de colonne [, ... n])]
FROM (Transact-SQL):
http://msdn.microsoft.com/en-us /library/ms177634(SQL.90).aspx
Conventions de syntaxe Transact-SQL:
http://msdn.microsoft.com/en-us /library/ms177563(SQL.90).aspx