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é

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top