Carácter desconocido en la declaración SQL
-
03-07-2019 - |
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
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