Domanda

Questa è una specie di domanda per principianti SQL, penso, ma qui va.

Ho una query SQL (SQL Server 2005) che ho messo insieme sulla base di una funzione di esempio definita dall'utente:

SELECT 
    CASEID,
    GetNoteText(CASEID)
FROM 
( 
    SELECT 
        CASEID 
    FROM 
        ATTACHMENTS 
    GROUP BY 
        CASEID 
) i
GO 

l'UDF funziona alla grande (concatena i dati da più righe in una tabella correlata, se ciò è importante) ma sono confuso riguardo al & i; i " dopo la clausola FROM. La query funziona bene con l'i ma fallisce senza di essa. Qual è il significato di " i " ;?

EDIT: come ha osservato Joel sotto, non è una parola chiave

È stato utile?

Soluzione

Quando si utilizza una sottoquery nella clausola FROM, è necessario assegnare un nome alla query. Dal momento che il nome non conta davvero per te, viene spesso scelto qualcosa di semplice come "i" o "a". Ma potresti inserire il nome che desideri, non c'è alcun significato per "i" da solo, e non è certamente una parola chiave.

Se si dispone di una query davvero complessa, potrebbe essere necessario unire la query secondaria ad altre query o tabelle. In tal caso il nome diventa più importante e dovresti scegliere qualcosa di più significativo.

Altri suggerimenti

L'i nomina la (sottoquery), necessaria e necessaria anche per ulteriori join.

Dovrai aggiungere il prefisso alle colonne nella query esterna con il nome della sottoquery quando ci sono nomi di colonne in conflitto tra le tabelle unite, come:

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

La " i " sta dando alla tua istruzione select un nome di tabella efficace. Potrebbe anche essere scritto (penso - non sono un ragazzo MSSQLServer) come " AS i " ;.

Come altri hanno affermato, è un alias di nome tabella per la sottoquery.

Al di fuori della sottoquery, è possibile utilizzare i.CASEID per fare riferimento ai risultati della sottoquery.

Non è troppo utile in questo esempio, ma quando si hanno più subquery, è uno strumento di chiarimento delle ambizioni molto importante.

Anche se sceglierei un nome variabile migliore. Anche "temp" è meglio.

L'i nomina la tua sottoquery in modo che se hai una query complessa con numerose sottoquery e hai bisogno di accedere ai campi puoi farlo in modo inequivocabile.

È buona norma dare alle tue subquery nomi più descrittivi per evitare la tua stessa confusione quando inizi a scrivere query più lunghe, non c'è niente di peggio che dover scorrere indietro una lunga istruzione sql perché hai dimenticato quale io. id è quello giusto o da quale tabella / query c.name viene recuperato.

La lezione da imparare è pensare alla persona che erediterà il tuo codice. Come altri hanno già detto, se il codice fosse stato scritto in questo modo:

SELECT DT1.CASEID, GetNoteText(DT1.CASEID) 
FROM (
   SELECT CASEID 
   FROM ATTACHMENTS
   GROUP BY CASEID
) AS DT1 (CASEID);

allora c'è una maggiore possibilità che il lettore lo abbia capito e potrebbe anche raccogliere "DT1" alludendo a una "tabella derivata".

" Tabella derivata " è un termine tecnico per utilizzare una sottoquery nella clausola FROM.

La sintassi della documentazione in linea di SQL Server mostra che table_alias non è facoltativo in questo caso; & Quot; table_alias " non è racchiuso tra parentesi e in base alle Convenzioni sulla sintassi Transact-SQL, gli elementi tra parentesi sono opzionali. La parola chiave " AS " è facoltativo, poiché è racchiuso tra parentesi ...

& nbsp; & nbsp; & nbsp; deriv_table [AS] table_alias [(column_alias [, ... n])]

FROM (Transact-SQL):
http://msdn.microsoft.com/en-us /library/ms177634(SQL.90).aspx

Convenzioni sulla sintassi Transact-SQL:
http://msdn.microsoft.com/en-us /library/ms177563(SQL.90).aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top