4

プロジェクト用とカテゴリ用の2つのドロップダウンリストがあります。
IDを取得するddprojectを選択する必要があります。このIDに基づいて、ddcategoryにデータを入力する必要があります。
テーブル構造SQLフィドル

ドロップダウンリストからProjectOneを選択した場合の簡単なクエリ

select  id,name from tbcategory where id in(1,2)  

しかし、私の問題は、in条件にいくつの値があるかわからないことです。

C#:最初に列名categoryidを分割して後で値を取得するとどうするか混乱します。
また、これを達成するために正しい方法で行っているのか、それとも他の方法で行っているのかを教えてください

編集済み: または、テーブル構造を変更する必要があります。変更する場合は、どのスキーマにする必要がありますか?

4

3 に答える 3

3

あなたのデータによると、カテゴリとプロジェクトの間に多対多の関係があります。したがって、この関係をモデル化するデータを保持するために、別の多対多テーブルをモデル化する必要があります。

ここで SQL フィドル

まず、Category と Project の間の Many:Many 関係を保持する新しいテーブルを作成します。

create table tbProjectCategory
(
  tbProjectId INT,
  tbCategoryId INT
);

次に、tbProject で文字列のカンマ区切りの関係を削除します。これは役に立ちません。代わりに、リンクを Many Many テーブルに挿入します。例えば:

insert into tbProjectCategory(tbProjectId, tbCategoryId) values (1, 1), (1, 2);

プロジェクト 1 をカテゴリ 1 および 2 にリンクします。

次に、プロジェクト 1 のすべてのカテゴリを検索するには、プロジェクト ID でフィルタリングして、多対多のリンク テーブルを結合する必要があります。

select  cat.id, cat.name 
  from tbcategory cat
  inner join tbProjectCategory prjcat
  on prjcat.tbCategoryId = cat.id
  where prjCat.tbProjectId = 1;

また、簡潔にするために ID 列を削除しました。これにより、どのデータ レコードがリンクされているかを簡単に知ることができます。

于 2013-01-16T11:20:38.590 に答える
3

次のような M:N 関係テーブルを作成します。

tbProjects2Categories
    IDCategory int;
    IDProject int;

次に、クエリを作成できます。

SELECT c.id, c.name FROM tbCategory c JOIN tbProjects2Categories pc 
                ON c.IDCategory = pc.IDCategory 
                WHERE pc.IDProject = @selectedProjectId;

プロジェクトとカテゴリ間の関係は次のようになります。

ID プロジェクト | ID カテゴリ

     1     |    1
     1     |    2
     1     |    3
     2     |    1
     2     |    3

そして、元のスキーマでは次のことを意味します。

(1,'ProjectOne','Mumbai','1,2,3'); 
(2,'ProjectTwo','USA','1,3');

答えを完成させるには:

エンティティの関係をコンマ区切りのリストに格納することは、実際には良い方法ではありません。その列の値を分割してクエリを機能させるのに苦労することさえあります。

于 2013-01-16T11:25:39.690 に答える
1

はい、コンマ区切りの値は、データベースにリレーションシップを格納するのに適した方法ではありません。2 つの元のテーブル間の関係を定義するために、もう 1 つのテーブルを作成する必要があります。

create table tbProjectCategory (id int IDENTITY(1,1),projectId int, categoryId int)

次に、次のように projectId に基づいてクエリを実行できます。

select * from tbcategory c
  inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;

このフィドルを試してください: http://sqlfiddle.com/#!3/b11acb/2

于 2013-01-16T11:27:40.033 に答える