2008-10-01 1 views
3

Это, похоже, вопрос с новичком SQL, но здесь идет.Незнакомый символ в операторе SQL

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

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

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

EDIT: Как указано ниже Джоэл, это не ключевое слово

ответ

16

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

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

+0

Ах, поэтому это вынуждает подзадачу рассматриваться как временную таблицу. Может быть, вы могли бы отметить, что в вашем ответе, если это правда) – cori 2008-10-01 14:25:47

3

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

1

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

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

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

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

6

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

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

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 
1

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

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

0

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

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

      derived_table [AS] table_alias [(column_alias [, ... N])]

FROM (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

0

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

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

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