表A:
字段:
UID  Name
1     a1
2     a2
3     a3表B
字段:
UID    PID
1        1
1        3
2        1
3        2
2        2
4        1
4        2
4        3表C
字段:
PID    Des
1     p1
2     p2
3     p3
.....我用表c的记录生成复选框,用户可以勾选p1,p3,p1+p2,p1+p2+...  等等任意组合,
查询出相应的表A中的记录。
比如:用户勾选p1即pid=1,查询出uid=1,2,4 三条记录;
用户勾选p1和p3 ,查询出uid=1,4 两条记录;
用户勾选p1,p2和p3,只能查询出uid=4 一条记录。
我就想实现这个查询,表C的记录不止3条。我目前想到比较笨的方法(感觉哈):勾选的查询条件以字符加分隔符传入(如1,2 或 1,3 或 1,2,3等等),然后用拆分分隔符的函数生成临时表,定义一个条件字符串,循环取得每条记录,给条件字符串赋值+= and exists(select UID from B where UID=表A.UID and PID=[取出记录的pid] ),最后去exec'这个动态加条件查询的sql语句'。那位兄弟有更好的办法啊?谢谢~~~~~

解决方案 »

  1.   

    select * from a
    where 1=1
    and exists (
    select 1 from b where UID=a.UID
    and pid=1
    )
    and exists (
    select 1 from b where UID=a.UID
    and pid=2
    )
    ...也就是说用户勾一个p1,就产生一个条件
    and exists (
    select 1 from b where UID=a.UID
    and pid=1
    )
    勾多少个产生多少个,拼成sql语句就可以了
      

  2.   

    可以參考下這個帖子http://community.csdn.net/Expert/topic/5615/5615325.xml?temp=.0327875
      

  3.   

    --如果在表B中,UID相同的時候,PID不會重復,可以這麼寫--創建存儲過程
    Create ProceDure SP_TEST(@PID Varchar(1000))
    As
    Select UID From B
    Where CharIndex(',' + Cast(PID As Varchar) + ',', ',' + @PID + ',') > 0
    Group By UID
    Having Count(UID) = Len(@PID) - Len(Replace(@PID, ',', '')) + 1
    GO
    --測試
    EXEC SP_TEST '1'
    EXEC SP_TEST '1,3'
    EXEC SP_TEST '1,2,3'
      

  4.   

    --如果在表B中,UID相同的時候,PID不會重復,可以這麼寫--完整的測試代碼--創建測試環境
    Create Table B
    (UID Int,
     PID Int)
    --插入數據
    Insert B Select 1, 1
    Union All Select 1, 3
    Union All Select 2, 1
    Union All Select 2, 2
    Union All Select 3, 2
    Union All Select 4, 1
    Union All Select 4, 2
    Union All Select 4, 3
    GO
    --創建存儲過程
    Create ProceDure SP_TEST(@PID Varchar(1000))
    As
    Select UID From B
    Where CharIndex(',' + Cast(PID As Varchar) + ',', ',' + @PID + ',') > 0
    Group By UID
    Having Count(UID) = Len(@PID) - Len(Replace(@PID, ',', '')) + 1
    GO
    --測試
    EXEC SP_TEST '1'
    EXEC SP_TEST '1,3'
    EXEC SP_TEST '1,2,3'
    --刪除測試環境
    Drop Table B
    Drop ProceDure SP_TEST
    --結果
    /*
    UID
    1
    2
    4UID
    1
    4UID
    4
    */
      

  5.   

    --如果在表B中,UID相同的時候,PID不會重復,可以這麼寫--如果傳入的不是PID,而是C表的Des--完整的測試代碼
    --創建測試環境
    Create Table B
    (UID Int,
     PID Int)
    --插入數據
    Insert B Select 1, 1
    Union All Select 1, 3
    Union All Select 2, 1
    Union All Select 2, 2
    Union All Select 3, 2
    Union All Select 4, 1
    Union All Select 4, 2
    Union All Select 4, 3Create Table C
    (PID Int,
     Des Varchar(10))
    Insert C Select 1,     'p1'
    Union All Select 2,     'p2'
    Union All Select 3,     'p3'
    GO
    --創建存儲過程
    Create ProceDure SP_TEST(@Des Varchar(1000))
    As
    Select UID From B
    Inner Join C
    On B.PID = C.PID
    Where CharIndex(',' + C.Des + ',', ',' + @Des + ',') > 0
    Group By B.UID
    Having Count(UID) = Len(@Des) - Len(Replace(@Des, ',', '')) + 1
    GO
    --測試
    EXEC SP_TEST 'p1'
    EXEC SP_TEST 'p1,p3'
    EXEC SP_TEST 'p1,p2,p3'
    --刪除測試環境
    Drop Table B, C
    Drop ProceDure SP_TEST
    --結果
    /*
    UID
    1
    2
    4UID
    1
    4*/