select * from t_tree start with jgbh='...' connect by sjjgbh='...' and .... 能得到机构树 这样的语句sql server里面好像没有
SQL SERVER 的树 ?CREATE TABLE #Data ( DataID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, ParentID INT )CREATE TABLE #temp1 ( LID INT ,Distance INT ,RID INT )CREATE TABLE #temp2 ( LID INT ,Distance INT ,RID INT )GO SET NOCOUNT ONINSERT #Data(ParentID)VALUES(NULL) DECLARE @I INT SET @I=1 WHILE @I<4 BEGIN INSERT #Data(ParentID)VALUES(@I) SET @I=@I+1 ENDGO SET NOCOUNT ONINSERT INTO #temp2 Select #Data.DataID,0,#Data.DataID From #DataINSERT INTO #temp1 Select DL.DataID,1,DR.DataID From #Data AS DL JOIN #Data AS DR ON DL.DataID=DR.ParentIDDECLARE @RowCount INT,@RowCount2 INT,@Distance INT,@Distance2 INTSET @Distance=-1 SET @RowCount2=0 SELECT @RowCount=COUNT(*) FROM #temp2WHILE(@RowCount<>@RowCount2) BEGIN SET @Distance=@Distance+1 SET @Distance2=@Distance+1 INSERT INTO #temp2 SELECT #temp1.LID,@Distance2,#temp2.RID FROM #temp1 JOIN #temp2 ON #temp1.RID=#temp2.LID WHERE #temp2.Distance=@Distance SET @RowCount2=@RowCount SELECT @RowCount=COUNT(*) FROM #temp2 END SET NOCOUNT OFFSELECT * FROM #temp2 ORDER BY LID,Distance,RIDGODROP TABLE #temp1DROP TABLE #temp2DROP TABLE #Data GO
mmzxg兄: 弱水兄没有用过SQL Server!
我的语句写错了,应该是: select * from t_jg start with jgbh='1070000000' connect by sjjgbh=prior jgbh jgbh: 机构编号 sjjgbh: 上级机构编号
我这里还有呢8、外连接 ·MS SQL SERVER 支持两种形式表间连接 ①从Sybase继承来的形式: 字段1 *= 字段2 (左连接) 字段1 =* 字段2 (右连接) 没有这种形式的全外连接语法 ②标准的外连接语法 left [outer] join on 逻辑表达式 right [outer] join on 逻辑表达式 full [outer] join (全外连接) on 逻辑表达式 这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误 Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables 这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的 例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO from dbo.VU_CAF_BILLS A,TU_Flag where A.CAF_NO*=TU_Flag.ObjNo 视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 ·Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷 字段1 = 字段2(+) (左连接) 字段1(+) = 字段2 (右连接) ·使用外连接语句的用处 ①不想因为表连接而使主表数据行丢失,这一点毋庸多说 ①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法, 使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句 而使用下面的语法: select TU_COMPANY.* from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode where TU_Comp_Agent.Id is null
10、表数据复制 ·库内数据复制 ·MS SQL Server Insert into 复制表名称 select 语句 (复制表已经存在) select 字段列表 into 复制表名称 from 表 (复制表不存在) ·Oracle Insert into 复制表名称 select 语句 (复制表已经存在) create table 复制表名称 as select 语句 (复制表不存在)
·文本文件转入、转出的批量处理 ·MS SQL Server BCP命令行程序 ·Oracle SQLLDR命令行程序 11、多表更新、删除 一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表 一般形式: ·MS SQL Server update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式 ·Oracle update A SET 字段1=(select 字段表达式 from B WHERE ...), 字段2=(select 字段表达式 from B WHERE ...) WHERE 逻辑表达式
to air_line(永恒的心) : 目前市面上是很難找到這樣的書。 就算有,也是寫的很膚淺的,很多實際的問題都沒有談到。 看上去好像是對SQL Server和Oracle分別只學了一個月的人寫的。
关于limit的不同 在oracle中可以 select * from table where... limit int,int limit直接挂在后面很方便,但是SQLSERVER不支持LIMIT,很是郁闷 用 select top 3 * from tablename where key not in (select top 10 key from tablename)这种代替,实在是不方便
2.功能不一样,PL-SQL功能更强一点,支持超大规模数据,可以把一个认得属性信息定义个数据类型,是家常便饭.但更晦涩一点,T-SQL更易学习一点,功能不是很强大.
3.两个编辑器,SQL SERVER做的确最好,不同类型 的关键字有不同的颜色,书写错误是灰色的,ORACLE没有做到着一点!很晚啦,睡觉:)~~~~~~~~~~~~~~~~~
由于MS SQL只能用于WINDOWS平台,所以有必要了解ORACLE,通过对比来达到互通的目的,是一个好方法。
扬兄说的没错,要2个通才可回答,希望知者尽言,1000分相送。
文档给你发到邮箱了,请查收,帮忙贴出,共享快乐 ^_^
TO: inalover(奇遇),thanks your html
TO: icevi(按钮工厂),is there e books?
http://www.itpub.net/showthread.php?s=&threadid=26184
太多了,SQL 6.5 和现在的操作有点相似!
在备份和恢复上都不相同!
管理的机制也不相同,很大的不同!
要说有什么大的不同,就是oracle比较强大吧,哈哈
3x everyone above.insert into yourtable select * from t1
在MSSQL中可用,在ORACLE中行么?好象前面的HTML中说反了?
是标准的SQL,到处可以用的。
(两次avg + 一个group by rowid)。
其它明显的如IronPromises(铁诺) -》 数据库基础版的zhuzhichao(竹之草)大哥写过一篇这方面的文章:http://www.itpub.net/showthread.php?s=&threadid=26185
http://www.itpub.net/showthread.php?s=&threadid=26184
只有两者都用了,才能体会到实在有太多的不同了。
-----------------------------------------------------
好象去年讨论过这个话题,当时弱水兄正在研读sql,也发了些高论。
现今几乎不见他了。
惆怅。
sys change_on_install
start with jgbh='...'
connect by sjjgbh='...'
and ....
能得到机构树
这样的语句sql server里面好像没有
(
DataID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
ParentID INT
)CREATE TABLE #temp1
(
LID INT
,Distance INT
,RID INT
)CREATE TABLE #temp2
(
LID INT
,Distance INT
,RID INT
)GO
SET NOCOUNT ONINSERT #Data(ParentID)VALUES(NULL)
DECLARE @I INT
SET @I=1
WHILE @I<4
BEGIN
INSERT #Data(ParentID)VALUES(@I)
SET @I=@I+1
ENDGO
SET NOCOUNT ONINSERT INTO #temp2
Select #Data.DataID,0,#Data.DataID
From #DataINSERT INTO #temp1
Select DL.DataID,1,DR.DataID
From #Data AS DL
JOIN #Data AS DR
ON DL.DataID=DR.ParentIDDECLARE @RowCount INT,@RowCount2 INT,@Distance INT,@Distance2 INTSET @Distance=-1
SET @RowCount2=0
SELECT @RowCount=COUNT(*) FROM #temp2WHILE(@RowCount<>@RowCount2)
BEGIN SET @Distance=@Distance+1
SET @Distance2=@Distance+1 INSERT INTO #temp2
SELECT #temp1.LID,@Distance2,#temp2.RID
FROM #temp1
JOIN #temp2
ON #temp1.RID=#temp2.LID
WHERE #temp2.Distance=@Distance SET @RowCount2=@RowCount
SELECT @RowCount=COUNT(*) FROM #temp2
END
SET NOCOUNT OFFSELECT * FROM #temp2
ORDER BY LID,Distance,RIDGODROP TABLE #temp1DROP TABLE #temp2DROP TABLE #Data
GO
弱水兄没有用过SQL Server!
select * from t_jg
start with jgbh='1070000000'
connect by sjjgbh=prior jgbh
jgbh: 机构编号
sjjgbh: 上级机构编号
但二者的SQL标准是一样的,
我也有很多问题,请楼上的朋友们多赐教
我刚从TSQL向PL/SQL转
很不适应
朋友们多鼓励我
区别1:sql server的存储过程可以有返回值。比方说
create proc ttt
as
select * from table
这样,这个结果集就作为返回值返回了。
在oracle中呢,过程就是过程,没有也不能有返回值的。要想返回,就用函数。
说到函数,就有第二个区别了,
sql server中的函数,几乎就可以用过程来代替,当然实现的写法上有不同了。但是,作用上是可以达到的。
oracle中,函数和过程,1就是1,2就是2。划分得很明显。
比方说,更新一个表,删除几条数据,就可以用过程来完成。而要从表中select记录出来,就要用函数了。
这种对照,从我个人认为觉得不需要做过多的这种比较,一个如果从来没有学过其他
数据库管理的人,可能更容易学习Oracle.现在我来说一下两者的区别和联系1、关于数据库的概念
我怎么找到或者创建自己的数据库
Oracle的数据库的概念已经完全不同于MS SQLOracle的服务和数据库,相当于MS SQL的数据库服务
Oracle的服务=后台进程+相关内存数据库=数据文件的集合
而且Oracle的服务是完全可以与数据文件脱离开来的
那么MS SQL的数据库,在Oracle哪儿能找到呢,
Oracle的Schema,Schema的中文意思:方案,意思是一个用户所拥有所有对象的集合
这里的对象包括表、视图、实例化视图、序列、过程、函数、程序包、同义词
(下面我会详细解释这其中的一些陌生的概念)所以我们要建立一个在Oracle中的类似于MS SQL的数据库:大致过程
·建立数据表空间(相当于MS SQL的数据库的数据文件)
·建立临时表空间(相当于MS SQL的数据库的事务日志文件)
·建立用户,他的却省表空间和临时表空间是刚建立的两个表空间
·给用户授权,最起码的角色权限是Connect 的角色
·以该用户登陆,创建自己的表、视图、实例化视图、序列、过程、函数、程序包、同义词等2、关于Oracle Manager Server与MS SQL的Enetrprise manager
应该说这两者有很大的差别,DBA Studio工具提供了与MS SQL的Enetrprise manager同样的功用,
DBA Studio工具对一般使用来说已经足够了。
但这里有必要对Oracle Manager Server解释一下
·它是Oracle 管理分布式数据库的服务,注意他是服务
·它却省并不安装
·它需要有自己管理所需要的资料库,在某个数据库中需要建立相应的用户
·它的等录需要身份验证,注意这里的身份验证,与管理所需要的资料库的用户是不是一个概念,
也不是数据库中的Sys和、system用户,它的却省用户是oemtemp
·它的功能有
·使用它,在管理端要启动Manager Server服务和智能代理服务(OracleAgent),被管理的数据库服务器
要启动智能代理服务(OracleAgent)3、关于Oracle 的Sys、System的用户与MS SQL的master的比较
MS SQL的master数据库存储了当前数据库服务的一些配置信息如
数据库设备(在MS SQL已经弱化)、字符集、数据文件、登陆帐号、拥有的数据库、整个服务参数配制等信息Oracle的Sys存储Oracle服务或者实例的信息及所有用户的数据字典信息
这一点不同于MS SQL,MS SQL每一个数据库拥有自己的对象的数据字典信息
System用户拥有数据字典是视图信息,有了这些视图,我们的查询数据库的信息就特别方便
却省情况下,system用户拥有DBA系统角色权限,而sys不仅拥有DBA 的权限还拥有SysDBA的权限DBA、SysDBA这两个系统角色有什么区别呢在说明这一点之前我需要说一下Oracle服务的创建过程
·创建实例
·启动实例
·创建数据库(system表空间是必须的)
启动过程
·实例启动
·装载数据库
·打开数据库SysDBA,是管理Oracle实例的,它的存在不依赖于整个数据库完全启动,
只要实例启动了,他就已经存在,以SysDBA身份登陆,装载数据库、打开数据库
只有数据库打开了,或者说整个数据库完全启动后,DBA角色才有了存在的基础!
4、Oracle中新的数据库对象:实例化视图、快照、序列、程序包、同义词、抽象的数据类型·实例化视图又称显形图:实例化说明他有自己的存储空间,视图:说明他的数据来源于其他表数据。
实例化视图中的数据,设置为隔一段时间更新数据,更新的模式可以定义为完全更新和增量更新
·快照基本上同实例化视图,只不过数据来源不同,快照数据来愿于远程数据库,而实例化视图
则来源于本地数据表
·序列,相当于MS SQL中的identity列,他是一个数字顺序列表
·程序包:他是过程、函数、全局变量的集合,他封装了私有变量、私有过程和私有函数
如:dbms_out包
·同义词:是对数据库中的对象的别名,同义词可以是全局的也可以是私有的(属于某个用户的)
如:Tab,col等
·抽象的数据类型,类似于C中的结构体或Pascal记录类型
关于类型,这里还有一个题外话:A Tab%RowType,这是一个特别的抽象的数据类型,该类型的分量就是TAB的字段
B Tab.TName%Type,这定义了一个和tab的字段TNAME相同的数据类型的变量,
想想他有什么好处5、Oracle数据库连接和MS SQL远程连接
两者都是为了实现分布式数据库的操作。
两者都能实现分布式事务,参见MS SQL的联机帮助6、Oracle回滚段和MS SQL的数据库事务日志文件
回滚段提供了事物回滚需要使用的数据变化以前的映象.这些映象是按条目存储的,
如果这些条目过少,一个事务等待另一个事务的几率增大,就会影响数据库的性能
却省安装时,提供一个系统回滚段他在System表空间.为了提高性能system 表空间
不应存储有任何数据字典信息以外的信息.MS SQL数据库事务日志文件功能雷同于回滚段,只不过他是同特定的数据库密切相关的7、关于数据表的管理
·超大型数据表的管理
一个数据表,尤其是那种流水帐表,长年累月后急剧膨胀,最后影响查询性能
怎么办,Oracle和MS SQL都提供了一种方法,把数据文件及其索引存放在一个特定的
数据文件或表空间里,但这个还是不能解决问题,怎么办,开发人员只能给表添加
时间的标志:如CWSJ2000(财务数据2000),CWSJ2001,CWSJ2002, 这种命名方式,
确实能提高查询性能,但是给开发带来了不少的麻烦(浪潮财务就是这样做的),
而且当你不知道数据在哪个表中的时候,你要联合这么表进行查询,岂不长哉!
Oracle提供了很好的手段解决了这个问题:表及索引分区存储。按字段值的范围
进行分区存储.具体做法不在说明。·Oracle索引组织表和MS SQL簇索引表
两者的数据存放顺序都是按照索引值的顺序存放的。·无事务回滚概念的表,对这种表的操作不村在事务的概念
记得以前MySQL是不提供事务的回滚(不知现在有否变化)
而Oracle提供了建表参数nologging,使对该表的操作不参与事物的回滚·索引
Oracle提供了多种MS SQL没有的索引类型
··位图索引,
比方说性别:仅有男女
第1条记录:男
第2条记录:男
第3条记录:女
第4条记录:男
第5条记录:女
第6条记录:男
.........
那它的索引:110101............看这种索引多节省空间,它适用于字段值是的已知几个中的一个··基于函数或者说表达式的索引,这个功能可谓强大
·MS SQL SERVER 支持两种形式表间连接
①从Sybase继承来的形式:
字段1 *= 字段2 (左连接)
字段1 =* 字段2 (右连接)
没有这种形式的全外连接语法
②标准的外连接语法
left [outer] join on 逻辑表达式
right [outer] join on 逻辑表达式
full [outer] join (全外连接) on 逻辑表达式
这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误
Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的
例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
from dbo.VU_CAF_BILLS A,TU_Flag
where A.CAF_NO*=TU_Flag.ObjNo
视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 ·Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷
字段1 = 字段2(+) (左连接)
字段1(+) = 字段2 (右连接) ·使用外连接语句的用处
①不想因为表连接而使主表数据行丢失,这一点毋庸多说
①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法,
使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句
而使用下面的语法:
select TU_COMPANY.*
from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
where TU_Comp_Agent.Id is null
9、触发器
·从我了解到的,MS SQL SERVER,仅有表的触发器,而且触发时机不够丰富
如插入触发在子,不区分单条插入还是多条插入,也不区分插入前触发还是插入后触发
碰到多条数据的插入,需要使用游标处理每条插入的数据 ·Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭
对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发
10、表数据复制
·库内数据复制
·MS SQL Server
Insert into 复制表名称 select 语句 (复制表已经存在)
select 字段列表 into 复制表名称 from 表 (复制表不存在)
·Oracle
Insert into 复制表名称 select 语句 (复制表已经存在)
create table 复制表名称 as select 语句 (复制表不存在)
·文本文件转入、转出的批量处理
·MS SQL Server
BCP命令行程序
·Oracle
SQLLDR命令行程序
11、多表更新、删除
一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表
一般形式:
·MS SQL Server
update A
SET 字段1=B表字段表达式,
字段2=B表字段表达式
from B
WHERE 逻辑表达式
·Oracle
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练 你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理
目前市面上是很難找到這樣的書。
就算有,也是寫的很膚淺的,很多實際的問題都沒有談到。
看上去好像是對SQL Server和Oracle分別只學了一個月的人寫的。
在oracle中可以
select * from table where... limit int,int
limit直接挂在后面很方便,但是SQLSERVER不支持LIMIT,很是郁闷
用
select top 3 * from tablename where key not in (select top 10 key from tablename)这种代替,实在是不方便