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

时间:2013-01-16 11:14:48

标签: c# asp.net linq sql-server-2008

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

如果我从下拉列表中选择ProjectOne

,这里是简单的查询
select  id,name from tbcategory where id in(1,2)  

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

C#: 第一个我拆分列名categoryid并稍后获取值,使我感到困惑 同时让我知道我是以正确的方式还是以任何其他方式来实现这个

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

3 个答案:

答案 0 :(得分:3)

根据您的数据,类别和项目之间存在许多关系。因此,您需要建模另一个许多:许多表来保存数据建模这种关系。

SQL Fiddle Here

首先,创建一个新表来保存Category和Project之间的Many:Many关系:

create table tbProjectCategory
(
  tbProjectId INT,
  tbCategoryId INT
);

然后,删除tbProject中的字符串逗号分隔关系 - 这没用。而是将链接插入Many Many表。 e.g:

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

将项目1链接到第1类和第2类。

然后,要查找项目1的所有类别,您需要通过Many:Many链接表加入,按项目标识进行过滤:

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

为了简洁起见,我还删除了您的标识栏 - 这样可以更轻松地了解链接了哪些数据记录。

答案 1 :(得分: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;

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

  

IDProject | IDCategory

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

这意味着在原始架构中:

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

要完成答案:

将实体关系存储在以逗号分隔的列表中并不是一个好习惯。您甚至可能很难分割该列值并使查询正常工作。

答案 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