首页
论坛
门户
空间
手机版
IXPUB
插件
收藏
设置
注册
登录
商店
搜索
培训
Wiki
Blog
归档
丛书
退出
ITPUB论坛
»
Oracle开发
» start with ... connect by用法简介 sql有向图问题期待新解决方案
‹‹ 上一主题
|
下一主题 ››
56
1/6
1
2
3
4
5
6
››
投票
交易
悬赏
活动
评价
|
打印
|
推荐
|
订阅
|
收藏
标题:
[精华]
start with ... connect by用法简介 sql有向图问题期待新解决方案
本主题由 zhangfengh 于 2008-8-9 00:01 加入精华
zhouwf0726
版主
精华贴数 5
个人空间
927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
#1
使用道具
发表于 2006-8-27 03:49
start with ... connect by用法简介 sql有向图问题期待新解决方案
/*******************************************************************************
通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询.
自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。
自从Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。
那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,
如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。
在Oracle 10g 之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),
Oracle 就会报出一个错误提示:“ ORA-01436: CONNECT BY loop in user data”。如果不删掉对父亲的引用就无法执行查询操作。
而在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE,
如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。
The start with .. connect by clause can be used to select data that has a hierarchical relationship
(usually some sort of parent->child, boss->employee or thing->parts).
It is also being used when an sql execution plan is explained.
syntax:
select ... [start with initial-condition] connect by [nocycle] recurse-condition
level
With level it is possible to show the level in the hierarchical relation of all the data.
--oracle 9i
sys_connect_by_path
With sys_connect_by_path it is possible to show the entire path from the top level down to the 'actual' child.
--oracle 10g
connect_by_root
connect_by_root is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.
connect_by_is_leaf
connect_by_isleaf is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.
connect_by_iscycle
connect_by_is_cycle is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.
--start with ... connect by ... 的处理机制
How must a start with ... connect by select statement be read and interpreted?
If Oracle encounters such an SQL statement, it proceeds as described in the following pseude code.
for rec in (select * from some_table) loop
if FULLFILLS_START_WITH_CONDITION(rec) then
RECURSE(rec, rec.child);
end if;
end loop;
procedure RECURSE (rec in MATCHES_SELECT_STMT, new_parent IN field_type) is
begin
APPEND_RESULT_LIST(rec);
for rec_recurse in (select * from some_table) loop
if FULLFILLS_CONNECT_BY_CONDITION(rec_recurse.child, new_parent) then
RECURSE(rec_recurse,rec_recurse.child);
end if;
end loop;
end procedure RECURSE;
created by zhouwf0726 2006.
*******************************************************************************/
--创建测试表,增加测试数据
create table test(superid varchar2(20),id varchar2(20));
insert into test values('0','1');
insert into test values('0','2');
insert into test values('1','11');
insert into test values('1','12');
insert into test values('2','21');
insert into test values('2','22');
insert into test values('11','111');
insert into test values('11','112');
insert into test values('12','121');
insert into test values('12','122');
insert into test values('21','211');
insert into test values('21','212');
insert into test values('22','221');
insert into test values('22','222');
commit;
--层次查询示例
select level||'层',lpad(' ',level*5)||id id
from test
start with superid = '0' connect by prior id=superid;
select level||'层',connect_by_isleaf,lpad(' ',level*5)||id id
from test
start with superid = '0' connect by prior id=superid;
--给出两个以前在"数据库字符串分组相加之四"中的例子来理解start with ... connect by ...
--功能:实现按照superid分组,把id用";"连接起来
--实现:以下两个例子都是通过构造2个伪列来实现connect by连接的。
/*------method one------*/
select superid,ltrim(max(sys_connect_by_path(id,';')),';') from(
select superid,id,row_number() over(partition by superid order by superid) id1,
row_number() over(order by superid) + dense_rank() over(order by superid) id2
from test
)
start with id1=1 connect by prior id2 = id2 -1
group by superid order by superid;
/*------method two------*/
select distinct superid,ltrim(first_value(id) over(partition by superid order by l desc),';')
from(
select superid,level l,sys_connect_by_path(id,';') id
from(
select superid,id,superid||rownum parent_rn,superid||to_char(rownum-1) rn
from test
)
connect by prior parent_rn = rn
);
--下面的例子实现把一个整数的各个位上的数字相加,通过这个例子我们再次理解connect by.
create or replace function f_digit_add(innum integer) return number
is
outnum integer;
begin
if innum<0 then
return 0;
end if;
select sum(nm) into outnum from(
select substr(innum,rownum,1) nm from dual connect by rownum<length(innum)
);
return outnum;
end f_digit_add;
/
select f_digit_add(123456) from dual;
/**********************************************************************************
***********************************************************************************
下面是关于SQL解决有向图问题,在这个例子中作者提到的错误
select * from fares connect by prior arrive = depart start with depart = 'LHR';
ERROR:
ORA-01436: CONNECT BY loop in user data
在oracle10g以上版本可以利用connect by的nocycle参数来解。有兴趣的朋友研究用一条sql实现有向图问题!
***********************************************************************************
**********************************************************************************/
一个常见的高级计算机科学问题可以在“有向图”的范畴之下描述。有向图是由一组向量和边所连接的一组有限的节点。
例如,一个节点可以想象为一座“城市”,而每个向量可以想象为两座城市间的一个“航线”。
有很多算法和论文讲到如何解决每种可能路线的遍历问题以及寻找最短路径或者最小代价路径的问题。
这些算法中大部分都是过程化的,或者是使用递归方面来解决的。然而 SQL 的声明性语言使得解决复杂的有向图问题更加容易,
而且不需要很多代码。
让我们以两座城市之间的航线为例子,创建一个表保存一些假想数据:
create table airports
(
code char(3) constraint airports_pk primary key,
description varchar2(200)
);
insert into airports values ('LHR','London Heathrow, UK');
insert into airports values ('JFK','New York-Kennedy, USA');
insert into airports values ('GRU','Sao Paulo, Brazil');
create table fares
(
depart char(3),
arrive char(3),
price number,
constraint fares_pk primary key (depart,arrive),
constraint fares_depart_fk foreign key (depart) references airports,
constraint fares_arrive_fk foreign key (arrive) references airports
);
insert into fares values('LHR','JFK',700);
insert into fares values('JFK','GRU',600);
insert into fares values('LHR','GRU',1500);
insert into fares values('GRU','LHR',1600);
不能使用CONNECT BY 语法来解决如何从伦敦到圣保罗,因为在图中有数据产生一个环(从圣保罗飞回):
select * from fares connect by prior arrive = depart start with depart = 'LHR';
ERROR:
ORA-01436: CONNECT BY loop in user data
要解决有向图问题,我们需要创建一个临时表来保存两个节点之间所有可能的路径。我们必须注意不复制已经处理过的路径,
而且在这种情况下,我们不想路径走回开始处的同一个地点。我还希望跟踪到达目的地所需航程的数目,以及所走路线的描述。
临时表使用以下脚本创建:
create global temporary table faretemp
(
depart char(3),
arrive char(3),
hops integer,
route varchar2(30),
price number,
constraint faretemp_pk primary key (depart,arrive)
);
一个简单的视图可以在稍微简化这个例子中使用的代码。视图可以根据 fares 表中的单个航程计算从 faretemp 表中的一个路径
到达一下一个航程的数据:
create or replace view nexthop
as
select src.depart,
dst.arrive,
src.hops+1 hops,
src.route||','||dst.arrive route,
src.price + dst.price price
from faretemp src,fares dst
where src.arrive = dst.depart
and dst.arrive != src.depart;
/
show errors;
这个算法相当简单。首先,使用 fares 表中的数据填充 faretemp 表,作为初始的航程。然后,取到我们刚才插入的所有数据,
使用它们建立所有可能的二航程(two-hop)路径。重复这一过程,直至在两个节点之间创建了新路径。
循环过程将在节点间所有可能的路径都被描述之后退出。如果我们只对某个开始条件感兴趣,
那么我们还可以限制第一次的插入从而减少装载数据的量。下面是发现路径的代码:
truncate table faretemp;
begin
-- initial connections
insert into faretemp
select depart,arrive,1,depart||','||arrive,price from fares;
while sql%rowcount > 0 loop
insert into faretemp
select depart,arrive,hops,route,price from nexthop
where (depart,arrive)
not in (select depart,arrive from faretemp);
end loop;
end;
/
show errors;
select * from faretemp order by depart,arrive;
可以在表 A 中查看输出。
前面的数据有一个小问题。数据是点之间最短路径(最小航程数)的集合。然而,从伦敦到圣保罗的航程却不是最便宜的一个。
要解决最便宜的费用问题,需要对我们的循环做一个改进,当在一个航程中发现一个更便宜的路线时使用这个路线代替原来的路线。
修改后的代码如下:
truncate table faretemp;
declare
l_count integer;
begin
-- initial connections
insert into faretemp
select depart,arrive,1,depart||','||arrive,price from fares;
l_count := sql%rowcount;
while l_count > 0 loop
update faretemp
set (hops,route,price) =
(select hops,route,price from nexthop
where depart = faretemp.depart
and arrive = faretemp.arrive)
where (depart,arrive) in
(select depart,arrive from nexthop
where price < faretemp.price);
l_count := sql%rowcount;
insert into faretemp
select depart,arrive,hops,route,price from nexthop
where (depart,arrive)
not in (select depart,arrive from faretemp);
l_count := l_count + sql%rowcount;
end loop;
end;
/
show errors;
select * from faretemp order by depart,arrive;
可能在表 B中查看输出。
算法发现LHR、JFK、GRU 路线比 LHR、GRU 路线便宜,所以用前者代替了后者。循环将在没有更便宜的费用,
并且没有其它可能路线时退出。
__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者
lgtxzxm
老会员
精华贴数 0
个人空间
0
技术积分 1002 (1835)
社区积分 1 (39721)
注册日期 2005-10-8
论坛徽章:0
#2
使用道具
发表于 2006-8-27 23:27
在哪个网站上看过这两篇文章,把文章的出处标出来不是更好吗?
只看该作者
wuxin44
初级会员
精华贴数 0
个人空间
0
技术积分 34 (36753)
社区积分 0 (348337)
注册日期 2005-4-14
论坛徽章:0
#3
使用道具
发表于 2006-8-28 03:11
SQL> select level||'层',connect_by_root,lpad(' ',level*5)||id id
2 from test2
3 start with superid = '0' connect by prior id=superid;
select level||'层',connect_by_root,lpad(' ',level*5)||id id
*
ERROR 位于第1行:
ORA-00904: 无效列名
connect_by_root似乎应该去掉啊。不然出错。
select superid,ltrim(max(sys_connect_by_path(id,';')),';')
from(
select superid,id,row_number() over(partition by superid order by superid) id1,
row_number() over(order by superid) + dense_rank() over(order by superid) id2
from test2
)
start with id1=1 connect by prior id2 = id2 -1
group by superid order by superid;
ERROR 位于第3行:
ORA-00923: 未找到预期 FROM 关键字
帖子内容不错,但似乎SQL文楼主未作验证。
仅仅验证到这里就走不下去了。
请求正确的SQL文。
只看该作者
zhouwf0726
版主
精华贴数 5
个人空间
927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
#4
使用道具
发表于 2006-8-28 09:04
已经修改了那个sql,当时笔误,呵呵!欢迎继续指正!
__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者
zhouwf0726
版主
精华贴数 5
个人空间
927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
#5
使用道具
发表于 2006-8-28 09:20
写这篇文章前边的一些理论参考了不少资料。我都是从网上搜索的。
可以按照下边两个主题搜索:
start with connect by
sql有向图
具体的地址我这里也没有保存。用connect by实现分组相加和数字求和都是我解决问题的时候整理的。
数字求和的可以参考:
http://www.itpub.net/619949,1.html
分组相加的可以参考:
http://www.itpub.net/showthread.php?threadid=614563
__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者
kiccleaf
初级会员
精华贴数 0
个人空间
0
技术积分 34 (36669)
社区积分 0 (266840)
注册日期 2005-2-1
论坛徽章:0
#6
使用道具
发表于 2006-8-28 10:21
不错楼主,收下先!太感谢了!
__________________
XuanSystem.HOST主机管理系统,下载了!http://bbs.openzj.com
只看该作者
zhouwf0726
版主
精华贴数 5
个人空间
927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
#7
使用道具
发表于 2006-8-28 13:37
再次理解start with connect by
/*********************************************************************************************
http://www.itpub.net/620932.html
问题提出:
一个高级SQL语句问题
假设有一张表,A和B字段都是NUMBER,
A B
1 2
2 3
3 4
4
有这样一些数据
现在想用一条SQL语句,查询出这样的数据
1-》2-》3—》4
就是说,A和B的数据表示一种连接的关系,现在想通过A的一个值,去查询A所对应的B值,直到B为NULL为止,
不知道这个SQL语句怎么写?请教高手!谢谢
*********************************************************************************************/
--以下是利用start with connect by的一个简单回答
CREATE TABLE TEST(COL1 NUMBER(18,0),COL2 NUMBER(18,0));
INSERT INTO TEST VALUES(1,2);
INSERT INTO TEST VALUES(2,3);
INSERT INTO TEST VALUES(3,4);
INSERT INTO TEST VALUES(4,NULL);
INSERT INTO TEST VALUES(5,6);
INSERT INTO TEST VALUES(6,7);
INSERT INTO TEST VALUES(7,8);
INSERT INTO TEST VALUES(8,NULL);
INSERT INTO TEST VALUES(9,10);
INSERT INTO TEST VALUES(10,NULL);
INSERT INTO TEST VALUES(11,12);
INSERT INTO TEST VALUES(12,13);
INSERT INTO TEST VALUES(13,14);
INSERT INTO TEST VALUES(14,NULL);
select max(col) from(
select SUBSTR(col,1,CASE WHEN INSTR(col,'->')>0 THEN INSTR(col,'->') - 1 ELSE LENGTH(col) END) FLAG,col from(
select ltrim(sys_connect_by_path(col1,'->'),'->') col from (
select col1,col2,CASE WHEN LAG(COL2,1,NULL) OVER(ORDER BY ROWNUM) IS NULL THEN 1 ELSE 0 END FLAG
from test
)
start with flag=1 connect by col1=prior col2
)
)
group by flag
;
__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者
淡若煙飛
曾经沧海
精华贴数 0
个人空间
0
技术积分 907 (2060)
社区积分 5 (15897)
注册日期 2006-3-1
论坛徽章:2
#8
使用道具
发表于 2006-8-28 13:57
高手!帮顶!
__________________
彼岸花,花开彼岸,
有花无叶,有叶无花,
花叶两不相见,生生相错……
-------------------------------------------------------------------
只看该作者
zhouwf0726
版主
精华贴数 5
个人空间
927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
#9
使用道具
发表于 2006-8-28 18:00
没人顶?自己顶一个!
刚才抽时间大致看了一下:
作者Scott Stephens的例子用他自己的数据没有问题,但是如果改成以下数据就会有问题。
delete from fares;
delete from airports;
insert into airports values('BJ','BEIJING');
insert into airports values('SH','SHANGHAI');
insert into airports values('GZ','GUANGZHOU');
INSERT INTO FARES VALUES('BJ','SH',500);
INSERT INTO FARES VALUES('SH','GZ',1500);
INSERT INTO FARES VALUES('BJ','GZ',1800);
INSERT INTO FARES VALUES('GZ','BJ',1600);
执行:
truncate table faretemp;
begin
-- initial connections
insert into faretemp
select depart,arrive,1,depart||','||arrive,price from fares;
while sql%rowcount > 0 loop
insert into faretemp
select depart,arrive,hops,route,price from nexthop
where (depart,arrive)
not in (select depart,arrive from faretemp);
end loop;
end;
/
show errors;
select * from faretemp order by depart,arrive;
DEPART ARRIVE HOPS ROUTE PRICE
---------- ---------- --------------------------------------- ------------------------------ ----------
BJ GZ 1 BJ,GZ 1800
BJ SH 1 BJ,SH 500
GZ BJ 1 GZ,BJ 1600
GZ SH 2 GZ,BJ,SH 2100
SH BJ 2 SH,GZ,BJ 3100
SH GZ 1 SH,GZ 1500
6 rows selected
明显少了一条遍历数据!
自己也写了个SQL暂时能解决这些测试数据:
select path,price from(
select l,path,lag(price) over(order by rownum) price from(
select l,flag,path,sum(price) over(partition by flag order by rownum) price from(
select l,depart,arrive,path,
SUBSTR(path,1,CASE WHEN INSTR(path,'->')>0 THEN INSTR(path,'->') - 1 ELSE LENGTH(path) END) FLAG,price
from(
select level l,depart,arrive,ltrim(sys_connect_by_path(depart,'->'),'->') path,price
--ltrim(sys_connect_by_path(price,'+'),'+') price
from fares connect by nocycle depart=prior arrive
)
)
)
where SUBSTR(path,1,CASE WHEN INSTR(path,'->')>0 THEN INSTR(path,'->') - 1 ELSE LENGTH(path) END) !=
SUBSTR(path,CASE WHEN INSTR(reverse(path),'>-')>0 THEN - INSTR(reverse(path),'>-') + 1 ELSE - LENGTH(path) END)
) where l=3;
PATH PRICE
-------------------------------------------------------------------------------- ----------
BJ->SH->GZ 2000
GZ->BJ->SH 2100
SH->GZ->BJ 3100
但是如果再往fare表加入数据,
insert into fares values('GZ','SH',1300);
再次执行:
select path,price from(
select l,path,lag(price) over(order by rownum) price from(
select l,flag,path,sum(price) over(partition by flag order by rownum) price from(
select l,depart,arrive,path,
SUBSTR(path,1,CASE WHEN INSTR(path,'->')>0 THEN INSTR(path,'->') - 1 ELSE LENGTH(path) END) FLAG,price
from(
select level l,depart,arrive,ltrim(sys_connect_by_path(depart,'->'),'->') path,price
--ltrim(sys_connect_by_path(price,'+'),'+') price
from fares connect by nocycle depart=prior arrive
)
)
)
where SUBSTR(path,1,CASE WHEN INSTR(path,'->')>0 THEN INSTR(path,'->') - 1 ELSE LENGTH(path) END) !=
SUBSTR(path,CASE WHEN INSTR(reverse(path),'>-')>0 THEN - INSTR(reverse(path),'>-') + 1 ELSE - LENGTH(path) END)
) where l=3;
没有把 BJ->GZ->SH 3100这条数据给查出来,这个是否connect by处理的问题?考虑可能是用nocycle参数oracle遇到第一个闭环就停止了,所以没有继续连接下边的数据。
执行Scott Stephens的脚本:
truncate table faretemp;
declare
l_count integer;
begin
-- initial connections
insert into faretemp
select depart,arrive,1,depart||','||arrive,price from fares;
l_count := sql%rowcount;
while l_count > 0 loop
update faretemp
set (hops,route,price) =
(select hops,route,price from nexthop
where depart = faretemp.depart
and arrive = faretemp.arrive)
where (depart,arrive) in
(select depart,arrive from nexthop
where price < faretemp.price);
l_count := sql%rowcount;
insert into faretemp
select depart,arrive,hops,route,price from nexthop
where (depart,arrive)
not in (select depart,arrive from faretemp);
l_count := l_count + sql%rowcount;
end loop;
end;
/
show errors;
select * from faretemp order by depart,arrive;
select * from faretemp order by depart,arrive;
DEPART ARRIVE HOPS ROUTE PRICE
---------- ---------- --------------------------------------- ------------------------------ ----------
BJ GZ 1 BJ,GZ 1800
BJ SH 1 BJ,SH 500
GZ BJ 1 GZ,BJ 1600
GZ SH 1 GZ,SH 1300
SH BJ 2 SH,GZ,BJ 3100
SH GZ 1 SH,GZ 1500
6 rows selected
就能得到一条遍历数据。
这个问题如果用过程写应该是比较好实现的,现在想用一条connect by的语句实现,希望有兴趣的朋友给出答案啊!
__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者
gsmzzq
一般会员
精华贴数 0
个人空间
0
技术积分 118 (14607)
社区积分 1 (37554)
注册日期 2005-3-11
论坛徽章:2
#10
使用道具
发表于 2006-8-30 09:54
好贴,顶一个!
好贴,顶一个!
只看该作者
56
1/6
1
2
3
4
5
6
››
投票
交易
悬赏
活动
相关内容
ITPUB论坛
≡ 数据库技术 ≡
> Oracle数据库管理
> Oracle开发
> Oracle Developer Suite
> Oracle入门与认证
> Oracle专题深入讨论
> Oracle新技术/11g
> Oracle电子文档
> Oracle Application Server套件
> IBM数据库产品
> MS SQL Server
> Sybase管理与开发
> MySQL及其它开源数据库
> 内存数据库
> 数据仓库与数据挖掘
> 移动及嵌入式数据库
≡ 企业信息化 ≡
> ERP产品与实践
> CRM产品与实践
> HR产品与实践
> 物流
> 供应链
> 供应链建模与仿真
> 物流设备与系统工程
> 企业管理咨询
> 管理协同与办公自动化
> IT服务管理
> 数据中心建设
> ERP二次开发
> Oracle ERP
> EBS相关文档
> PeopleSoft与JDE
> SAP R/3
> SAP Business One开发与快速实施
> SAP财务及CRM
> SAP后勤及HR
> mySAP ERP
> 系统开发及跨应用设置
> SAP相关文档
> 国外其它ERP产品
> 国内ERP产品
≡ 开发技术 ≡
> Java入门与认证版
> Java web开发及框架技术
> Java企业开发
> ASP.NET【已迁移到微软开发技术论坛】
> .Net企业开发与应用【已迁移到微软开发技术论坛】
> WEB程序开发
> WEB 2.0技术
> 动态语言
> 移动与游戏开发
≡ 系统设计与项目管理 ≡
> 系统分析与UML
> 系统分析与UML精华区
> 项目管理
> 项目过程
> 软件测试
> 算法讨论与研究
≡ IBM软件技术园地 ≡
> IBM数据库产品
> Lotus
> Tivoli
> Websphere
> Rational
> 与SOA相关的IBM产品与技术
> IBM软件技术精英协会
> 软件技术精英活动专版
≡ 操作系统与硬件 ≡
> AIX及IBM产品【已迁移到IXPUB】
> HP-UX及HP产品【已迁移到IXPUB】
> Solaris及SUN产品【已迁移到IXPUB】
> Linux及其应用 【已迁移到IXPUB】
> 其它UNIX系统【已迁移到IXPUB】
> windows系统及微软相关产品 【已迁移到IXPUB】
> 存储设备与容灾技术 【已迁移到IXPUB】
> 服务器 【已迁移到IXPUB】
≡ 行业纵向讨论区 ≡
> IT业界评论与展望
> 政府与教育事业
> 中国政府信息主管联盟
> 电信行业
> 金融行业
> 医卫行业
> 制造行业
> 电力行业
> 信息安全与审计
≡ 会员交流 ≡
> IT职业生涯
> 招聘求职商务信息
> 体育世界
> 体育博彩专版
> 旅游,驴友
> 汽车世界
> 外语角
> 数码摄影
> 你的故事我的歌
> 音乐推荐区
> 电子图书与IT文档资料
> 软件交流
> 软件交流精华区
≡ ITPUB产品与服务 ≡
> ITPUB地面活动专版
> BLOG天地
> WIKI世界
> 授权用户区
> 站务管理
≡ 微软开发技术 ≡
> 开发工具和语言
> .NET Framework 相关
> Visual Basic/VB.net
> Visual C#
> Visual C++/vc.net
> Visual Studio
> .NET软件架构与模式
> .NET开发辅助工具及框架
> Web开发
> ASP.NET与AJAX
> Web相关技术讨论(IIS等)
> Silverlight 技术
> 微软企业级产品技术
> SQL Server
> windows server
> SharePoint
> Exchange Server
> Biztalk
> 嵌入式及移动开发
> Windows Embedded 嵌入式技术
> Windows 移动设备
> Office开发
> Microsoft office system
> Office Business Application
> 微软产品用户交流区
> .Net电子书籍&&书籍介绍
> .Net人才交流
技术积分榜
社区积分榜
徽章
电子杂志
会员
团队
统计
邮箱
游乐场
帮助
TOP
CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号
联系我们
法律顾问
控制面板首页
编辑个人资料
积分交易
公众用户组
好友列表
升级个人空间
基本概况
论坛排行
主题排行
发帖排行
积分排行
在线时间
管理团队
管理统计