Pregunta

Esta es una especie de pregunta de novato de SQL, creo, pero aquí va.

Tengo una consulta SQL (SQL Server 2005) que reuní en función de una función definida por el usuario de ejemplo:

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

la UDF funciona muy bien (concatena datos de varias filas en una tabla relacionada, si es que eso importa) pero estoy confundido acerca de la " i " después de la cláusula FROM. La consulta funciona bien con la i pero falla sin ella. ¿Cuál es el significado de la " i " ;?

EDITAR: como Joel señaló a continuación, no es una palabra clave

¿Fue útil?

Solución

Cuando utiliza una subconsulta en la cláusula FROM, debe asignar un nombre a la consulta. Dado que el nombre realmente no te importa, a menudo se elige algo simple como 'i' o 'a'. Pero podrías poner el nombre que quisieras, no hay ningún significado para 'i' por sí mismo, y ciertamente no es una palabra clave.

Si tiene una consulta realmente compleja, es posible que deba unir su consulta secundaria con otras consultas o tablas. En ese caso, el nombre se vuelve más importante y debe elegir algo más significativo.

Otros consejos

La i asigna un nombre a la (subconsulta), que es necesaria, y también necesaria para futuras combinaciones.

Tendrá que prefijar columnas en la consulta externa con el nombre de la subconsulta cuando haya nombres de columnas en conflicto entre tablas unidas, como:

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

El " i " está dando a su declaración selecta un nombre de tabla efectivo. También podría escribirse (creo que no soy un tipo de MSSQLServer) como " AS i " ;.

Como han dicho otros, es un alias de nombre de tabla para la subconsulta.

Fuera de la subconsulta, puede usar i.CASEID para hacer referencia a los resultados de la subconsulta.

No es muy útil en este ejemplo, pero cuando tienes varias subconsultas, es una herramienta de desambiguación muy importante.

Aunque, elegiría un nombre de variable mejor. Incluso " temp " es mejor.

La i asigna un nombre a su subconsulta, de modo que si tiene una consulta compleja con numerosas subconsultas y necesita acceder a los campos, puede hacerlo de forma inequívoca.

Es una buena práctica dar a sus subconsultas nombres más descriptivos para evitar su propia confusión cuando comienza a escribir consultas más largas, no hay nada peor que tener que retroceder a través de una declaración en SQL larga porque ha olvidado cuál. id es la correcta o de la tabla / consulta c.name se está recuperando.

La lección aprendida es pensar en la persona que heredará su código. Como han dicho otros, si el código hubiera sido escrito así:

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

entonces hay una mayor posibilidad de que el lector lo haya descubierto y hasta pueda que recoja 'DT1' aludiendo a una 'tabla derivada'.

" Tabla derivada " es un término técnico para usar una subconsulta en la cláusula FROM.

La sintaxis de los Libros en pantalla de SQL Server muestra que table_alias no es opcional en este caso; " table_alias " no está encerrado entre corchetes y de acuerdo con las Convenciones de Sintaxis de Transact-SQL, las cosas entre corchetes son opcionales. La palabra clave " AS " aunque es opcional ya que está encerrado entre paréntesis ...

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

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

Convenciones de sintaxis de Transact-SQL:
http://msdn.microsoft.com/en-us /library/ms177563(SQL.90).aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top