personagem desconhecido na instrução SQL
-
03-07-2019 - |
Pergunta
Este é tipo de pergunta novato SQL, eu acho, mas aqui vai.
Eu tenho uma consulta SQL (SQL Server 2005) que eu coloquei com base em uma função definida pelo usuário exemplo:
SELECT
CASEID,
GetNoteText(CASEID)
FROM
(
SELECT
CASEID
FROM
ATTACHMENTS
GROUP BY
CASEID
) i
GO
o UDF funciona muito bem (ele concatena dados de várias linhas em uma tabela relacionada, se o que importa em tudo), mas estou confuso sobre a cláusula "i" depois do FROM. A consulta funciona bem com o i mas não sem ela. Qual é o significado do "i"?
EDIT: Como Joel observado abaixo, não é uma palavra-chave
Solução
Quando você usa uma subconsulta na cláusula FROM, você precisa dar a consulta de um nome. Desde o nome realmente não importa para você, algo simples como 'i' ou 'a' é muitas vezes escolhido. Mas você pode colocar qualquer nome lá você queria- não há nenhum significado para 'i' por si só, e certamente não é uma palavra-chave.
Se você tiver uma consulta muito complexa, pode ser necessário para participar da sua sub consulta com outras consultas ou tabelas. Nesse caso, o nome se torna mais importante e você deve escolher algo mais significativo.
Outras dicas
Os nomes que eu o (subconsulta), que é necessária, e também precisava de mais junta.
Você terá que prefixar colunas na consulta externa com o nome subconsulta quando há conflito nomes das colunas entre tabelas associadas, 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
O "i" está dando a sua instrução select um nome de tabela eficaz. Ele também poderia ser escrito (eu acho - eu não sou um cara MSSQLServer) como "AS i"
.Como outros declarou, é um alias de nome da tabela para a subconsulta.
Fora da subconsulta, você poderia usar i.CASEID de referência para os resultados da subconsulta.
Não é muito útil neste exemplo, mas quando você tem vários subconsultas, é uma ferramenta disambiguation muito importante.
Embora, eu escolheria um nome melhor variável. Mesmo "temp" é melhor.
Os nomes que eu seu subconsulta de modo que se você tem uma consulta complexa com vários subconsultas e você precisa acessar os campos que você pode fazê-lo de forma inequívoca.
É uma boa prática para dar aos seus subqueries nomes mais descritivos para prevenir a sua própria confusão quando você começar a entrar em escrever consultas mais longas, não há nada pior do que ter que rolar para cima através de uma instrução SQL longa, porque você esqueceu que eu. ID é o caminho certo ou qual tabela / consulta c.name está sendo recuperada.
A lição a aprendi é pensar da pessoa que vai herdar seu código. Como já foi dito, se o código tivesse sido escrito assim:
SELECT DT1.CASEID, GetNoteText(DT1.CASEID)
FROM (
SELECT CASEID
FROM ATTACHMENTS
GROUP BY CASEID
) AS DT1 (CASEID);
então há uma chance maior que o leitor teria percebi isso e pode até pegar em 'DT1' aludindo a uma 'tabela derivada'.
"A tabela derivada" é um termo técnico para usar uma subconsulta na cláusula FROM.
O SQL Server Books Online sintaxe mostra que table_alias não é opcional, neste caso; "Table_alias" não está entre colchetes e de acordo com as Convenções de Transact-SQL Sintaxe, as coisas entre parênteses são opcionais. A palavra-chave "AS" é opcional, embora uma vez que está entre colchetes ...
derived_table table_alias [AS] [(column_alias [, ... n])]
FROM (Transact-SQL):
http://msdn.microsoft.com/en-us /library/ms177634(SQL.90).aspx
Convenções de Transact-SQL Sintaxe:
http://msdn.microsoft.com/en-us /library/ms177563(SQL.90).aspx