2012-02-25 254 views
2

我在我的同事寫的代碼(如下所示)中有一個簡單的查詢。 t這是什麼意思?在查詢內部還有什麼是;的作用?我很確定t不是任何表格,也不是我數據庫中任何地方的任何字段。並猜測這個查詢的工作原理!這個SQL中的「t」是指什麼?

string query = @"SELECT COUNT(*) FROM (SELECT AttemptNo FROM attempt_exercise 
       WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode)t; 
       "; 

的代碼如下所示(任何其它信息如需要):

MySqlCommand cmd = new MySqlCommand(query, _conn); 
cmd.Parameters.AddWithValue("@uId", uId); 
cmd.Parameters.AddWithValue("@eId", eId); 
cmd.Parameters.AddWithValue("@mode", mode); 
attemptCount = Convert.ToInt32(cmd.ExecuteScalar()); 
_conn.Close(); 
return attemptCount; 
+0

@BenLee不,當我刪除噸,我得到的錯誤'每個派生表必須有自己的別名' – nawfal 2012-02-25 07:20:16

回答

3

您的同事創建的查詢(SELECT COUNT(*))使用子查詢自己命名t。這t僅僅是指

SELECT AttemptNo FROM attempt_exercise 
    WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode 

他可以切實把它命名爲temp更明確一點的臨時表名。這變成了一張表的原因是因爲在MySQL中,一個SELECT查詢返回行爲像一個表的行。所以,這個內部查詢得到AttemptNo,並創建一個臨時表t。外部查詢然後計算這些數據。

;查詢裏面是讓一個完整的語句時,查詢由該程序調用。如果沒有包含該字符串,則字符串query將不包含有效的MySQL語句。最後的;是完成變量的賦值。

+0

查詢如何SELECT嘗試否FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @ mode'首先表格?它返回一個值,而不是表名是不是? – nawfal 2012-02-25 07:21:48

+0

@nawfal它返回構成數據「表」的表的行。然後,'t'將其命名爲別名 – simchona 2012-02-25 07:22:38

+0

哦,我希望如果您將該信息添加到您的答案,以便它變得清晰和完美:) – nawfal 2012-02-25 07:23:53

1

它只是嵌套查詢的別名。查詢內部的分號是一個語句終結符 - 它是ANSI sql標準的一部分。

3

t是你的子查詢的別名,你需要它。

所以,你可以這樣寫:

SELECT COUNT(*) FROM attempt_exercise 
WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode; 

而且會一直等同。

不過是你嘗試加入你的子查詢到別的東西,你會看到可能需要有點快:

SELECT COUNT(*) FROM 
    (SELECT AttemptNo FROM attempt_exercise 
    WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode) t 
JOIN AttemptStatisticsTableOfSomeSort a 
    ON t.AttemptNo = a.AttemptNo; 
+0

希望我可以標記多個答案。這也對 – nawfal 2012-02-25 07:33:55

1

別名的子查詢。如果子查詢在FROMJOIN子句中顯示爲tablesource - 它應該有一個別名。

1

以這種方式創建的所有臨時表(即在FROM子句中)必須有一個可以引用的別名。在這種情況下,別名是t。如果編碼員的寫作更加清晰,他們就不會在之前省略可選的AS

重點是,這只是一個臨時名稱,在這種情況下並不重要,但它需要使其工作。

這就是說,以下是可能更有效:

SELECT COUNT(DISTINCT AttemptNo) FROM attempt_exercise WHERE FK_UId = @uId AND FK_EId = @eId AND Mode = @mode 
+0

很好的答案。謝謝。我感謝你的努力,以提供更高效的查詢,但在我的情況下,我不需要明確,但所有的'嘗試不',:)儘管調整,謝謝:) – nawfal 2012-02-25 07:26:56

+0

希望我可以標記多個答案。這也是正確的 – nawfal 2012-02-25 07:33:31

+0

@kolink:OP的查詢不計數不同的'Attemptno'。它統計所有這些。 – 2012-02-25 07:55:19