Незнакомый символ в выражении SQL - PullRequest
3 голосов
/ 01 октября 2008

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

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

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

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

РЕДАКТИРОВАТЬ: как отметил Джоэл ниже, это не ключевое слово

Ответы [ 7 ]

16 голосов
/ 01 октября 2008

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

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

6 голосов
/ 01 октября 2008

Имя 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
3 голосов
/ 01 октября 2008

"i" дает вашему оператору выбора эффективное имя таблицы. Его также можно записать (я думаю, я не из MSSQLServer) как «AS i».

1 голос
/ 01 октября 2008

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

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

1 голос
/ 01 октября 2008

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

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

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

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

0 голосов
/ 02 октября 2008

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

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

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

0 голосов
/ 02 октября 2008

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

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

производная_таблица [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

...