2017-12-16 19 views
1

私は14種類の従業員のテーブルを持っています。私はSQL Serverデータベースに接続されているC#アプリケーションを持っています。テキストボックスに姓を入力すると、その姓のレコードが返され、リストボックスに表示されます。複数のテーブルから特定の値を取得する

しかし、私は1つのテーブルでこれを行うことができました。したがって、 "Jones"と入力すると、1つのテーブルからジョーンズを戻して表示します。

すべての14のテーブルからすべてのジョーンズを戻したいと思います。言い換えれば、私が姓を入力すると、14のすべてのテーブルからその姓のすべてのレコードを表示するアプリケーションが必要です。

これに対して合理的なアプローチは何でしょうか?すべての従業員が1つのテーブルを持っていれば分かりやすいでしょうが、私は別々のテーブルが必要です。基本的には、検索ボタンをクリックすると、指定された名前の14個のテーブルのいずれかからアプリケーションを取得する必要があります。

これには適切な方法はありますか?

+0

なぜ分離が必要ですか?あなたは14テーブルを結合するビューを作成することができますが、1つのテーブルを持つことでパフォーマンスが向上する可能性があります。 –

+0

私は後でアプリを拡張する方法を知っていないので、私はスタッフをカテゴリに分けたかった。すべてのカテゴリーとすべてのスタッフを1つのカテゴリーに入れるのではなく、Sales、Technical Dept、Managerなどのアイディアが好きだった。私はあなたが言っているものを得るが、私はこれらすべての人の共通の土台を作る必要がある。 –

+1

@NikosKapなぜ各カテゴリのテーブルを作成するのではなく、各ユーザーのカテゴリを割り当てるだけではないのですか? – Neir0

答えて

0

データベースに次のストアドプロシージャを定義します

CREATE PROCEDURE GetAll_SP 
(
    @FirstName VARCHAR(50) 
) 
AS 
    BEGIN 
     (SELECT 1, first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName) 
     UNION 
     (SELECT 2, first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName) 
     UNION 
     (SELECT 3, first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName) 
     -- .... 
    END 

GO 

か、次の1の代わりに、あなたは、ユーザーの場所を制御のいずれかの種類を持っている必要はありません。

CREATE PROCEDURE GetAll_SP 
(
    @FirstName VARCHAR(50) 
) 
AS 
    BEGIN 
     (SELECT first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName) 
     UNION ALL 
     (SELECT first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName) 
     UNION ALL 
     (SELECT first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName) 
     -- .... 
    END 

GO 

次に、あなたのコードで:

String firstName = "Jones"; 

using (SqlCommand cmd = new SqlCommand("GetAll_SP", m_Connection)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName; 

    m_Connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
+0

いいですね。私はこれを試してチェックして戻ってきます。私はListsとDapperを使っているので、C#でいくつかの変更を加えなければなりません。私はお返事を確認します。 –

+0

美しい。出来た。 –

0

コード14回を繰り返して、すべてのテーブルから値を収集するか、データアクセステクノロジに応じて、すべての14テーブルのSQLクエリを1つのステートメントで一度に送信します。

+0

14個のルックアップを持つストアドプロシージャを追加し、アプリでストアドプロシージャを呼び出すことはできますか?それは理にかなっていますか? –

+0

はいこれも問題ありません。ストアドプロシージャは非常に高速です... – Markus

+0

これを試してチェックします。 –

0

さて、あなたのSQLのようなものになりますので、あなたがUNION ALL演算子を使用することができ、すべての14個のテーブルからの結果を得るために:あなたはすべての選択のフィールドの同じ量を持っている必要があり

(SELECT first_name, last_name FROM table1 WHERE first_name='John') 
UNION ALL 
(SELECT first_name, last_name FROM table2 WHERE first_name='John') 
... 
(SELECT first_name, last_name FROM table14 WHERE first_name='John') 

を。ただし、すべての名前(およびその他の共有データ)を1つのテーブルに保存し、異なるデータセットを持つ14個のテーブルすべてでKeyと接続する方がよいでしょう。

SELECT first_name, last_name, user_type, user_id WHERE first_name='John' 

そしてフィールドuser_typeはあなたで情報を与えるとして、あなたが対応するテーブルからフィールドを盗んことができます:あなたは(クエリおよびおそらく遅い)上記のこのようなこのような長いクエリを防ぐことができ、クエリがより次のようになりますその方法14個のテーブルのうちどの他のデータとのuser_idを検索するために、あなたにそのユーザーのデータを提供しますので、2番目のクエリは次のようになります。

SELECT job_position, worksheet, other_data FROM tableN WHERE user_id=... 
0

単に設定@SearchStrとすべてのテーブルのすべての列が検索されます。

drop table #results 
go 

declare @SearchStr nvarchar(100) 
set @SearchStr = 'Donna%' -- use wildcards 

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) 

SET NOCOUNT ON 

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
SET @TableName = '' 
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

WHILE @TableName IS NOT NULL 
BEGIN 
    SET @ColumnName = '' 
    SET @TableName = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE  TABLE_TYPE = 'BASE TABLE' 
      AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
      AND OBJECTPROPERTY(
        OBJECT_ID(
         QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
         ), 'IsMSShipped' 
          ) = 0 
    ) 

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
    BEGIN 
     SET @ColumnName = 
     (
      SELECT MIN(QUOTENAME(COLUMN_NAME)) 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE  TABLE_SCHEMA = PARSENAME(@TableName, 2) 
       AND TABLE_NAME = PARSENAME(@TableName, 1) 
       AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'text') 
       AND QUOTENAME(COLUMN_NAME) > @ColumnName 
     ) 

    print cast(@TableName as nvarchar(200)) + ' ' + @ColumnName 

    IF @ColumnName IS NOT NULL 
     BEGIN 
      INSERT INTO #Results 
      EXEC 
      (
       --'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
       --FROM ' + @TableName + ' (NOLOCK) ' + 
       --' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 

       'SELECT ''' + @TableName + '.' + @ColumnName + ''', ' + @ColumnName + ' 
       FROM ' + @TableName + ' (NOLOCK) ' + 
       ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
      ) 
     END 
    END 
END 

SELECT ColumnName, ColumnValue FROM #Results 
関連する問題