1

私の 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();
}
4

3 に答える 3

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
)

これでPages、特定Pageの 、StateまたはUser

SELECT * FROM Pages WHERE UserID = (userId)
SELECT * FROM Pages WHERE StateID IN (1, 5, 20)
SELECT * FROM Pages WHERE PageID = (pageID)
于 2013-01-31T23:21:27.487 に答える
1

正しい答えは、このすべての情報が 1 つのテーブルに保持されるようにデータベースを変更する必要があるということです。簡単な答えは、数分かけてすべてのテーブルを結合するビューを作成し、それらがすべて 1 つのテーブルにあるかのようにアクセスできるようにすることです。

ただし、他の回答との私の回答の唯一の違いは、C# コードでそれらを結合しないことです。それらをすべて結合するデータベース上に実際のビューを作成するだけです。ビューは (長いですが) シンプルになり、コードもシンプルになります。

于 2013-01-31T23:26:31.593 に答える
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

いくつかの異なる列がある場合は、* をテーブルに共通する列名に置き換えます。

しかし、他の人が示唆しているように、DB スキーマをリファクタリングするのが最善です!

于 2013-01-31T23:19:19.457 に答える