2011-03-08 72 views
1

我想做一個全部在一個查詢,甚至是從三個表中拉出兩步查詢。需要幫助找到一個好的設計和架構

表#1:遊戲 - 該表中保持類型的遊戲和具有遊戲的描述等

表#2:GameProfiles - 此保持從表「遊戲」的ID,所以它們都有一個GamesId列。此表包含遊戲贏了,遊戲迷失等等

表#3:Games_WhateverGame - 這不是一個特定的表,有多個表,例如,如果我有一個遊戲BasketBall,將會有一個單獨的表因爲它叫做Games_BasketBall,它有自定義列取決於遊戲。例如,籃球隊將會有一個籃板球。該表將具有其自己的主鍵ID。

我可以很容易地將Games和GameProfiles一起在其常見的「GameId」列上使用內部聯接,但是如何使其成爲可以在相同查詢中動態取決於GamesId的「Games_BasketBall」 。我可能正在構思這個錯誤,所以我願意接受建議。我似乎不能想到一個真正流暢的方式使這項工作正確,因爲每個遊戲將有不同的配置文件實體,無論如何我想使關係到每個表容易,所以我可以拉一切查詢。

此代碼的查詢沒有與Games_Basketball的關係,我希望能夠將它全部放入一個閱讀器,以便它具有正確的信息。

using (SqlConnection myConnection = new SqlConnection(myConnectionString)) 
    { 

     myConnection.Open(); 
     String selectSql = "SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId WHERE UserId = @UserId"; 

     SqlCommand myCommand = new SqlCommand(selectSql, myConnection); 
     myCommand.Parameters.AddWithValue("@GameProfile", UserId); 


     reader = myCommand.ExecuteReader(); 
     gameTable.DataSource = reader; 
     gameTable.DataBind(); 
     myConnection.Close(); 
    } 
+0

當您查詢多個gameType時,您將獲得每個gameType的唯一列。因此,對於用戶擁有10個gameType的查詢,如果每個gameType表有5列,則會得到〜50列。 – 2011-03-08 08:39:10

+0

爲什麼你不能在一個查詢中返回多個結果集?您將在一個閱讀器中獲取所有結果集,只是在多個結果集中。但這是一次數據庫訪問。 – 2011-03-10 05:09:05

回答

0

爲了您的當前瑪我會去是這樣的:

public enum GameType { Basketball, Snooker, ... } 

void BindGameData(GameType gameType) 
{ 

[ sql connection code ] 

StringBuilder sb = new StringBuilder(); 
// those constant parts should be stored outside in config file 
sb.append("SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId "); 
sb.append("INNER JOIN "); 
sb.append("aspnet_" + gameType.toString()); // adopt to yours naming pattern 
sb.append("ON aspnet_Games.GameId = "); 
sb.append("aspnet_" + gameType.toString() + ".GameId"); 
sb.append("WHERE UserId = @UserId"); 

String selectSql = sb.toString(); 

[rest of yours sql connection code] 

} 
+0

如果您查詢多種遊戲類型,它應該是'LEFT OUTER JOIN'! – 2011-03-08 08:35:56

0

您也可以使用MARS(多張活動結果集)來實現自己的目標。在MARS中,您同時使用兩個sqldatareader。

這裏是一個小例子:

SqlDataReader rdrone = null; 
    SqlDataReader rdrtwo = null; 
    string connectionstring = "server=sugandha;initial catalog = Employeedetail;uid = sa;pwd= sa";MultipleActiveResultSets = true; 
    SqlConnection con = new SqlConnection(connectionstring); 
    SqlCommand cmdone = new SqlCommand("select * from Employee", con); 
    SqlCommand cmdtwo = new SqlCommand("select * from Employeedept", con); 
    con.Open(); 
    rdrone = cmdone.ExecuteReader(); 
    DataTable dtone = new DataTable(); 
    dtone.Load(rdrone); 
    dataGridView1.DataSource = dtone; 
    rdrtwo = cmdtwo.ExecuteReader(); 
    DataTable dttwo = new DataTable(); 
    dttwo.Load(rdrtwo); 
    dataGridView2.DataSource = dttwo; 
    con.Close(); 
0

如果你想在同一時間獲得所有比賽的所有信息,這是不實際的,在一個查詢。而且,您知道,用戶不想等待您執行135 LEFT JOIN操作以從所有遊戲「無論」表中獲取信息。

所以,儘管這是可能的,但這並不實際,而且您確實可能不想這樣做。用戶不太可能想要讀取所有的數據,對吧?

僅當用戶需要時才顯示用戶需要什麼。如果用戶點擊「籃球」,然後您可以查詢已經加入了兩個或三個表格的視圖,您需要顯示有關「籃球」遊戲的信息。