• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

求SQL查询语句

LoveInSnowing 2008-03-15 04:46:24
数据库为access

表A
id pid text
1 0 A1
2 0 A2
3 1 A3
4 1 A4
5 2 A5
6 3 A6
7 2 A7

其中A表中的id为自动编号,pid为数字。pid的意思是父编号,0代表无父项,其余代表其父项的id为该值。
可用以下图示表示:
+----- A1 (id = 1, pid = 0)
|---- A3 (id = 3, pid = 1)
|--- A6 (id = 6, pid = 3)
|---- A4 (id = 4, pid = 1)
+----- A2 (id = 2, pid = 0)
|---- A5 (id = 5, pid = 2)
|---- A7 (id = 7, pid = 2)

表B
id cid clid
1 1 200803150001
2 2 200803150001
3 1 200803150002
4 1 200803150003
5 2 200803150003
6 3 200803150004
7 3 200803150005
8 2 200803150005
9 1 200803150005
10 4 200803150006
11 5 200803150006
12 4 200803150007
13 3 200803150007
14 6 200803150008
15 5 200803150008
16 5 200803150009
17 7 200803150009

其中表B中的id为自动编号,cid为数字,其值与表A中的id相对应

现求如下要求的SQL语句,
1.根据表A中pid的值不同获得其下所有子项,如:
当pid = 1时,取得表B中cid = 3、6、4的记录,且clid不重复
当pid = 2时,取得表B中cid = 5、7的记录,且clid不重复
当pid = 3时,取得表B中cid = 6的记录,且clid不重复
2.根据表A中pid的值不同,获得其下一层子项,如:
当pid = 1时,取得表B中cid = 3、4的记录,且clid不重复
当pid = 2时,取得表B中cid = 5、7的记录,且clid不重复
当pid = 3时,取得表B中cid = 6的记录,且clid不重复
...全文
103 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
LoveInSnowing 2008-03-15
回楼上各位,其实我是用VC++和ADO编写的程序,事实上也做到了,但就是效率太差,所以想求教一条SQL语句来提高效率
回复
qiyousyc 2008-03-15
Access没有办法的,在前台循环处理巴。
回复
dawugui 2008-03-15
[Quote=引用 8 楼 dawugui 的回复:]
第一个问题只能通过憨数或循环来处理.

第二个问题只取其下一层可用6楼的办法.
[/Quote]

第一个问题只能通过函数或循环来处理.

第二个问题只取其下一层可用6楼的办法.
回复
dawugui 2008-03-15
第一个问题只能通过憨数或循环来处理.

第二个问题只取其下一层可用6楼的办法.
回复
OracleRoob 2008-03-15
to LoveInSnowing :

如果你的后台数据库是Access,则必须在你的前台写代码处理。

思路楼上已经贴出来了,需要循环。
回复
dawugui 2008-03-15
2.根据表A中pid的值不同,获得其下一层子项,如: 
当pid = 1时,取得表B中cid = 3、4的记录,且clid不重复
当pid = 2时,取得表B中cid = 5、7的记录,且clid不重复
当pid = 3时,取得表B中cid = 6的记录,且clid不重复

------------------------------------------------------
create table B(id int, pid int, [text] varchar(10))
insert into B values(1, 0, 'A1')
insert into B values(2, 0, 'A2')
insert into B values(3, 1, 'A3')
insert into B values(4, 1, 'A4')
insert into B values(5, 2, 'A5')
insert into B values(6, 3, 'A6')
insert into B values(7, 2, 'A7')
go

select n.id pid, m.id from B m , B n where m.pid = n.id order by pid

drop table B

/*
pid id
----------- -----------
1 3
1 4
2 5
2 7
3 6

(所影响的行数为 5 行)
*/
回复
LoveInSnowing 2008-03-15
[Quote=引用 4 楼 wangtiecheng 的回复:]
SQL Server可以如楼上处理,但Access使用的是Jet-SQL,无法使用上述方法。

必须写代码循环处理。
[/Quote]
那请问,如何写法?
刚接触SQL语句,有的地方不是太懂
回复
OracleRoob 2008-03-15
SQL Server可以如楼上处理,但Access使用的是Jet-SQL,无法使用上述方法。

必须写代码循环处理。

回复
dawugui 2008-03-15

现求如下要求的SQL语句,
1.根据表A中pid的值不同获得其下所有子项,如:
当pid = 1时,取得表B中cid = 3、6、4的记录,且clid不重复
当pid = 2时,取得表B中cid = 5、7的记录,且clid不重复
当pid = 3时,取得表B中cid = 6的记录,且clid不重复
------------------------------------------------------------
--查找指定节点的所有子节点的示例函数
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO

--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/
回复
OracleRoob 2008-03-15

Access一次只能执行一条SQL。

多条SQL需要多次执行,这是限制。


在SQL Server中,可以一次执行多条SQL语句。
Access使用的是Jet-SQL,SQL Server使用的是T-SQL,两者用法上相差很大。


JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=



回复
OracleRoob 2008-03-15


Access使用的是Jet-SQL,SQL Server使用的是T-SQL,两者用法上相差很大。


JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=


回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-15 04:46
社区公告
暂无公告