我有一张表。数据如下:
productID     valuesName 
0300001        无光驱
0300001        集成
0300001        2G
0300001        320G
0300002       内置
0300002       集成
0300003       无光驱
0300003       集成
0300003       2G
0300003       320G
求教各位我怎么样能查到 valuesName 即等于‘无光驱’又等于 ‘集成’ 还等于 ‘2G’  的productID  
这个  valuesName  的参数个数不确定。有时候两个  有时候三个  还有时候更多那位大侠帮我解决一下。建表语句已经写好了, 直接copy可用。create table ProductParamters
(
productID varchar(30) not null,
valuesName nvarchar(300) not null
)
goinsert into ProductParamters values ('0300001','无光驱')
insert into ProductParamters values ('0300001','集成')
insert into ProductParamters values ('0300001','2G')
insert into ProductParamters values ('0300001','320G')
insert into ProductParamters values ('0300002','内置')
insert into ProductParamters values ('0300002','集成')
insert into ProductParamters values ('0300003','无光驱')
insert into ProductParamters values ('0300003','集成')
insert into ProductParamters values ('0300003','2G')
insert into ProductParamters values ('0300003','320G')select * from  ProductParamters 

解决方案 »

  1.   

    这个只能有动态拼接Sql语句
    select * from ProductParamters where valuesName in (@value ) @value 自己拼接
      

  2.   

    试试这样行不,先取到参数的个数n,参数做成‘v1’,‘v2’,‘v3’的形式,比如s=‘v1’,‘v2’,‘v3’
    然后用下面的语句:
    select productid from ProductParamters where valuesName in (s) group by productid having count(productid)=n
      

  3.   

    “能查到 valuesName即等于‘无光驱’又等于 ‘集成’ 还等于 ‘2G’ 的productID”什么意思?同一个productID么?
      

  4.   

    1)针对同一个productID下的不同valuesName 
    select * from ProductParamters
    where 1=1
    -------------------下面这些你在应用程序中遍历加载条件
    AND valuesName ='XXX'
    AND valuesName ='XXXX'2)针对不是同一个productID下的不同valuesName 
    select * from ProductParamters
    where 1=1
    -------------------下面这些你在应用程序中遍历加载条件
    valuesName in('XXX' ,'XXXX','','')
      

  5.   

    把不确定的先拼接成这种形式,  
    假设定义一个条件
    string where=" '无光驱','集成','2G'";
    这个字符串是动态的 你通过C# 线进行处理好。
    然后  在拼接 SQL 语句string sqlselect="select distinct productID from ProductParamters where valuesName in ("+ where+")";可以试试这样 处理下吧。
      

  6.   

    嗯。肯定是同一个productID 同时满足'无光驱','集成','2G'等几个条件。
    1楼 7楼 8楼  的肯定是查不出来的。
    还请各位高手帮忙呀。
      

  7.   

    3楼的可以。就是多了个参数。sql有没有函数能分析出参数的个数?
      

  8.   


    自己用程序判断啊,生成sql
      

  9.   

    你这个要用存储过程来实现,首先,先创建一个分隔字符串的函数,代码如下,你直接执行就行:Create function [dbo].[f_split](@SourceSql varchar(8000),@StrSeprate varchar(10))
    returns @temp table( [id] int identity(1,1),a varchar(100))
    as 
    begin
        declare @i int
        set @SourceSql=rtrim(ltrim(@SourceSql))
        set @i=charindex(@StrSeprate,@SourceSql)
        while @i>=1
        begin
            insert @temp values(left(@SourceSql,@i-1))
            set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
            set @i=charindex(@StrSeprate,@SourceSql)
        end
        if @SourceSql<>'' 
           insert @temp values(@SourceSql)
        return 
    end
    接下来,就是写存储过程,下面是我写好的,你执行就行:
    Create proc [dbo].[test111]
    (
      @valuename varchar(500)    --这里是输入参数,你直接输入那段字符串就行,例如:无光驱,集成
    )
    as begindeclare @name varchar(500)
    declare @i int,@len int
    set @i=1
    select @len=count(id) from dbo.f_split(@valuename,',')
    while @i<@len
    begin
    select @name=a from dbo.f_split(@valuename,',') where id=@i
    select productID from ProductParamters where valuesName =@name
    set @i=@i+1
    endend
    帮你测了下,没有问题,呵呵
      

  10.   

    SELECT * FROM ProductParamters P
    WHERE P.productID IN (
    SELECT M.productID FROM 
    (
    SELECT a.productID,status =stuff((
    select ','+convert(varchar(20),valuesName) 
    FROM ProductParamters WHERE productID = a.productID  for xml path('')),1,1,'')
    FROM ProductParamters a 
    group by a.productID
    )M
    WHERE M.status ='内置,集成'
    )
      

  11.   

    修正一下14楼的SQ,这样就不要考虑条件的顺序了,试试吧,应该没问题了。SELECT * FROM ProductParamters P
    WHERE P.productID IN (
    SELECT M.productID FROM 
    (
    SELECT a.productID,status =stuff((
    select ','+convert(varchar(20),valuesName) 
    FROM ProductParamters WHERE productID = a.productID  for xml path('')),1,1,'')
    FROM ProductParamters a 
    group by a.productID
    )M
    WHERE 1=1
    AND CHARINDEX('内置',M.status)>0
    AND CHARINDEX('集成',M.status)>0
    )