日期:2014-05-19  浏览次数:20429 次

感觉有点难:一个根据字符串多组合的复合的查询!期待更好的解决方法。
表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语句 '。

那位兄弟有更好的办法啊?谢谢~~~~~

------解决方案--------------------
--如果在表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
4

UID
1
4

UID
4
*/