2008-10-01 70 views
3

這是一種SQL新手問題,我認爲,但是在這裏。SQL語句中不熟悉的字符

我有一個SQL查詢(SQL Server 2005中),我已經把基於一個示例用戶定義函數:

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

的UDF的偉大工程(它串接在相關多行數據表,如果這很重要),但我對FROM子句後面的「i」感到困惑。該查詢適用於我,但失敗了,沒有它。 「我」的意義是什麼?

編輯:由於喬爾下面指出的那樣,當你在使用子查詢FROM子句不是一個關鍵字

回答

16

,你需要給查詢的名稱。由於這個名字對你來說並不重要,因此通常會選擇簡單的'我'或'a'。但是你可以在任何你想要的名字上加上任何名字 - 對我來說沒有任何意義,它肯定不是一個關鍵詞。

如果您有一個非常複雜的查詢,則可能需要將您的子查詢與其他查詢或表連接起來。在這種情況下,名字變得更重要,你應該選擇更有意義的東西。

+0

啊,所以這是強制子查詢被視爲一個臨時表。也許你可以注意到,在你的答案中,如果是的話) – cori 2008-10-01 14:25:47

3

「我」給你的選擇語句一個有效的表名。它也可以寫成(我認爲 - 我不是一個MSSQLServer的傢伙)「AS我」。

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聯機叢書語法顯示在這種情況下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」暗指一個「派生表」。