Вопрос

Я думаю, это своего рода вопрос новичка в SQL, но вот что дальше.

У меня есть SQL-запрос (SQL Server 2005), который я собрал на основе примера пользовательской функции:

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

UDF отлично работает (он объединяет данные из нескольких строк в связанной таблице, если это вообще имеет значение), но меня смущает буква "i" после предложения FROM .Запрос отлично работает с i, но без него завершается неудачей.В чем значение "я"?

Редактировать:Как отметил Джоэл ниже, это не ключевое слово

Это было полезно?

Решение

Когда вы используете подзапрос в предложении FROM, вам нужно присвоить запросу имя.Поскольку имя на самом деле не имеет для вас значения, часто выбирают что-нибудь простое, например "я" или "а".Но вы могли бы поместить туда любое имя, какое пожелаете - само по себе "я" ничего не значит, и это, конечно, не ключевое слово.

Если у вас действительно сложный запрос, возможно, вам потребуется объединить ваш вложенный запрос с другими запросами или таблицами.В этом случае название становится более важным, и вам следует выбрать что-то более значимое.

Другие советы

i называет (подзапрос), который требуется, а также необходим для дальнейших соединений.

Вам придется добавлять к столбцам во внешнем запросе префикс имени подзапроса, если между объединяемыми таблицами есть конфликтующие имена столбцов, например:

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

Буква "i" присваивает вашему оператору select эффективное имя таблицы.Это также можно было бы написать (я думаю - я не специалист по MSSQLServer) как "КАК я".

Как указывали другие, это псевдоним имени таблицы для подзапроса.

Вне подзапроса вы могли бы использовать i.CASEID для ссылки на результаты подзапроса.

В данном примере это не слишком полезно, но когда у вас есть несколько подзапросов, это очень важный инструмент устранения неоднозначности.

Хотя я бы выбрал лучшее имя переменной.Даже "темп" лучше.

I называет ваш подзапрос, так что, если у вас сложный запрос с многочисленными подзапросами и вам нужно получить доступ к полям, вы можете сделать это недвусмысленным способом.

Хорошей практикой является давать вашим подзапросам более описательные имена, чтобы избежать вашей собственной путаницы, когда вы начнете писать более длинные запросы, нет ничего хуже, чем прокручивать назад длинный оператор sql, потому что вы забыли, какой именно i.id является правильным или из какой таблицы / запроса c.name извлекается.

Урок, который нужно усвоить, заключается в том, чтобы подумать о человеке, который унаследует ваш код.Как уже говорили другие, если бы код был написан следующим образом:

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

тогда повышается вероятность того, что читатель разобрался бы в этом и, возможно, даже наткнулся бы на "DT1", намекающий на "производную таблицу".

"Производная таблица" - это технический термин, обозначающий использование подзапроса в предложении FROM.

Синтаксис онлайн-книг по SQL Server показывает, что table_alias в данном случае не является необязательным;"table_alias" не заключен в квадратные скобки, и в соответствии с соглашениями о синтаксисе Transact-SQL, данные в квадратных скобках необязательны.Ключевое слово "AS" является необязательным, поскольку оно заключено в квадратные скобки...

   производная таблица [ КАК ] table_alias [ ( column_alias [ ,...n ] ) ]

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

Соглашения о синтаксисе Transact-SQL:
http://msdn.microsoft.com/en-us/library/ms177563 (SQL.90).aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top