在多个SQL表中搜索数据

时间:2013-01-31 23:00:17

标签: c# asp.net sql

在我的SQL数据库中,我为美国的每个州都有一张表。用户可以在不同的状态下创建多个页面。每个表都有一个“UserID”列,该列始终与登录用户匹配。如何在多个表中搜索“UserID”?

string sqlquery = "SELECT * FROM[all tables] WHERE @UserID ='" + userID.Text + "'";

SqlConnection conn1 = new SqlConnection(connString);
SqlCommand comm1 = new SqlCommand(sqlquery, conn1);
SqlDataReader DR1 = comm1.ExecuteReader();
if (DR1.Read())
{
Textbox1.Text = DR1.GetValue(0).ToString();
}

3 个答案:

答案 0 :(得分:8)

我还没有看到你的数据库架构,但我已经知道你需要重构它了。没有必要为每个州提供一张桌子,对此的维护可能很粗糙。你应该拥有的是一个包含所有状态的表,然后是另一个表,其中包含对State表的引用,该表包含您想要的任何信息(您的“页面”)

CREATE TABLE States
(
    StateID int not null, --PK
    StateName nvarchar(32) not null
)

CREATE TABLE Pages
(
    PagesID int not null, --PK
    StateID int not null, --FK
    UserID int not null
    //Whatever other columns you need
)

现在,您可以根据特定PagesPageState

查询User表格
SELECT * FROM Pages WHERE UserID = (userId)
SELECT * FROM Pages WHERE StateID IN (1, 5, 20)
SELECT * FROM Pages WHERE PageID = (pageID)

答案 1 :(得分:1)

正确的答案是您需要更改数据库,以便将所有这些信息保存在一个表中。简单的答案是花几分钟时间创建一个视图,将所有表联合在一起,以便您可以像访问一个表一样访问它们。

我与其他人的答案唯一不同的是,我不会在你的c#代码中加入它们。我只想在数据库上创建一个实际的视图,将它们组合在一起。视图很简单(虽然很长),但代码很简单。

答案 2 :(得分:0)

如果表格具有相同的列,我会选择类似的。使用sql UNION

var statesTables = new[]{"NY, Texas, Oregano, Alabama}";

var qBuild = new StringBuilder();

qBuild.Append(string.Format("SELECT * FROM {0} WHERE UserId = @userId ", statesTables[0]));

for(int i=1;i<stateTables.Length;i++){
     qbuild.Append(string.Format("UNION SELECT * FROM {0} WHERE UserId = @userId ", statesTables[i]))
}

SqlConnection conn1 = new SqlConnection(connString);
SqlCommand comm1 = new SqlCommand(qBuild.ToString(), conn1);
comm1.Parameters.Add(new SqlParameter("userId", userId));

它将生成SQL:

SELECT * FROM NY WHERE UserId = @userId
UNION 
SELECT * FROM Texas WHERE UserId = @userId
UNION 
SELECT * FROM Oregano WHERE UserId = @userId
UNION 
SELECT * FROM Alabama WHERE UserId = @userId

如果有一些不同的列,请将*与列名称替换为表格。

但正如其他人所说,重构数据库架构将是最好的!