如何使用未知数量的IN条件进行选择查询



我有两个下拉列表,一个用于项目,第二个用于类别。
我有一个选择ddproject在那里我得到id,基于这个id我必须填充ddcategory。
表结构

这里有一个简单的查询,如果我从下拉列表中选择ProjectOne

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

但是我的问题是我不知道在in条件下会有多少值。

C #:首先,我分割列名称categoryid,然后获得值,我很困惑。
也让我知道我做的是正确的方式还是其他的方法来实现这个

编辑:或者我应该改变我的表结构,如果是,那么模式是什么?

根据您的数据,Category和Project之间存在许多:许多的关系。因此,您需要对另一个Many:Many表进行建模,以保存对这种关系进行建模的数据。

SQL Fiddle Here

首先,创建一个新表来保存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的所有类别,您需要通过Many:Many链接表进行连接,并通过项目Id:

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

为了简洁起见,我还删除了您的身份栏-这使得更容易知道哪些数据记录被链接。

我将创建如下的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;

项目和类别之间的关系如下:

IDProject | IDCategory

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

它的意思是在你原来的schema中:

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

完成答案:

将实体关系存储在逗号分隔的列表中并不是一个好的做法。您甚至可能需要几天的时间来拆分列值并使您的查询工作。

是的,逗号分隔的值不是在数据库中存储关系的好方法。您应该再创建一个表来定义两个原始表之间的关系:

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

然后你可以根据投影来查询它,像这样:

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

请试试这个提琴:http://sqlfiddle.com/#!3/b11acb/2

相关内容

  • 没有找到相关文章