2011-07-29 104 views
0

我有3個表,X,Y和Z,其中X引用了Y和Z中的ID;我有以下查詢輸出X的所有行ŸID和Z ID都存在:從連接表中檢索數據

SELECT * FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID 

不幸的是選擇,例如,X.ID AS標識等等等等是不是一種選擇,因爲有太多的列。

我運行這個查詢很好,但我使用dt.Rows[i]["X.ID"],其中dt是上述查詢的DataTable表示,試圖檢索表X中的ID,但它引發異常(列'X.ID'不屬於表DefaultView。)。

我已經嘗試搜索正確的語法去在列名稱字符串(「X.ID」),但一直無法找到任何東西。請有人對此有所瞭解嗎?提前謝謝了。

問候, 理查德

+0

「列太多」是你的理由?你知道大多數IDE和多個第三方工具都可以使列表成爲一個Cakewalk,對嗎? –

回答

2

如果我正確理解你的問題,你必須包含您的查詢的結果的DataTable:

SELECT * FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID 

那麼你一定要選擇基於表X中ID列的DataTable中的一行。

您可以通過其序號(它在列集合中的數字位置)引用ID列。例如,如果ID列是從結果你的SELECT語句設置第一列,你可以這樣做:

Convert.ToInt16(dt.Rows[i][0]); // Assuming ID is an int column 

編輯 重新閱讀你的問題,你說「X.ID AS ID等等不是一個選項,因爲列數太多「。所以如果這是你的堅定立場,你可以忽略我下面的答案的後半部分。

另外,正如jdmonty所說,你可以明確地選擇列。我想補充一點,如果有列名是跨表常見,你也應該別名的列名,就像這樣:

SELECT x.ID AS ID, x.NextColumn AS NextColumn 
FROM x 
INNER JOIN Y y ON x.Y_ID = y.ID 
INNER JOIN Z z ON x.Z_ID = z.ID 

,你可以使用別名點列(Y連接表甚至選擇列。 ID例如)符號。

然後就可以通過名稱引用該列:

Convert.ToInt16(dt.Rows[i]["ID"]); // Assuming ID is an int column 
2

明確選擇在查詢應該可以解決這個錯誤的列(更不用提,總體良好做法)

SELECT X.ID, X.NAME, X.[COLUMN], x.[ETC] FROM X INNER JOIN Y ON X.Y_ID = Y.ID INNER JOIN Z ON X.Z_ID = Z.ID 

然後,你可能只是需要把ID爲列名查詢到數據表,但我不能完全記得

+0

謝謝。這做到了。我最終將列作爲變量輸入到函數中,默認爲*,所以我可以指定p.ID AS ID,r.Name AS Name,n.Description AS Description等,然後使用行[i] [「ID |名稱|說明「]來獲取列。它現在出色地工作,並且這個網站比原始網站快上百倍 – ClarkeyBoy

0

行[i] [「ID」]應該沒問題,只要你從一個具有ID列的表中只選擇

1

我想你想要的是選擇x中的所有列,但排除y和z中的列。

SELECT X. * FROM X INNER JOIN Y開X.Y_ID = Y.ID INNER JOIN上的Z X.Z_ID = Z.ID

然後在數據表您參考列的名稱。數據表不知道數據庫端使用的X別名。

dt.Rows [I] [ 「ID」]