表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语句'。那位兄弟有更好的办法啊?谢谢~~~~~
字段:
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语句'。那位兄弟有更好的办法啊?谢谢~~~~~
解决方案 »
- 沟沟和X-MAN进来接分啦,谢谢你们
- 问一个比较复杂的问题,希望大家帮忙
- 关于改变数据库表所有者中出错的问题?
- 求救~~为什么没有返回结果?
- 我用asp+ms sql做了一个网站,请问如何移植数据库到另一台电脑使用
- 开发一个考勤系统,采用什么方案才能防止“请人代打考勤”这各现象??(注:不采用指纹识别)
- ODBC 驱动程序不支持所需的属性。
- 请问一下在SQLSERVER中把一个表的一个字段的值附加到另一个表这种情况怎样解决?
- 丢数据的情况怎么回事啊,急@@@,超复杂,散分啊@@@
- 请教高手,急急急!!!在线等
- 请教 一条sql语句
- 如何禁止和启用一个列的标示,即 identity(1,1) 这个东西!
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语句就可以了
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'
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
*/
--創建測試環境
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*/