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