我想制作一个多合一的查询,甚至是从3个表中提取的两步查询。
表#1:游戏 - 此表包含一种游戏类型,并有游戏描述等。
表#2:GameProfiles - 它从表'Games'中保存一个id,因此它们都有一个GamesId列。此表包含赢得的游戏,游戏丢失等等
表#3:Games_WhateverGame - 这不是一个特定的表,有多个表,例如,如果我有一个游戏BasketBall,它将有一个单独的表名为Games_BasketBall,它有自定义列,具体取决于游戏。例如,篮球将有一个篮板专栏。该表将拥有自己的主键ID。
我可以使用内部联接在他们常用的“GameId”列上轻松地将Games和GameProfile拉到一起,但是我如何制作它以便我也可以在同一查询中拉动'Games_BasketBall',动态取决于GamesId。我可能正在构建这个错误,所以我愿意接受建议。我似乎无法想到一种非常流畅的方式使这项工作正确,因为每个游戏都有不同的配置文件实体,所以我想让每个表的关系变得容易,所以我可以在一个查询中提取所有内容。
此代码的查询没有关于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 :(得分:0)
对于你们当前的shema,我会选择类似的东西:
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]
}
答案 1 :(得分: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();
答案 2 :(得分:0)
如果您想同时获取所有游戏的所有信息,在一个查询中执行此操作是不切实际的。并且,你知道,用户不想等你做135个LEFT JOIN操作来从所有游戏“无论什么”表中获取信息。
所以,即使它有可能,它也不实用,你真的可能不想那样做。用户不太可能想要读取所有数据,对吧?
只需在用户需要时显示用户需要的内容。如果用户点击“篮球”,然后,您可以查询已加入两个或三个表格的视图,以显示有关“篮球”游戏的信息。