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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top