- 論壇徽章:
- 0
|
1、外連接
·MS SQL SERVER 支持兩種形式表間連接
①?gòu)腟ybase繼承來的形式:
字段1 *= 字段2 (左連接)
字段1 =* 字段2 (右連接)
沒有這種形式的全外連接語(yǔ)法
②標(biāo)準(zhǔn)的外連接語(yǔ)法
left [outer] join on 邏輯表達(dá)式
right [outer] join on 邏輯表達(dá)式
full [outer] join (全外連接) on 邏輯表達(dá)式
這里的邏輯表達(dá)式 可以是很復(fù)雜的表達(dá)式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你寫的查詢語(yǔ)句報(bào)告過這樣的錯(cuò)誤
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
這句話告訴你,你查詢語(yǔ)句引用的視圖或者子查詢也用到了外連接,但是引用視圖或者子查詢外連接語(yǔ)法與你的外連接語(yǔ)法不一直導(dǎo)致的
例如: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的外連接語(yǔ)法是標(biāo)準(zhǔn)的SQL語(yǔ)法,而本語(yǔ)句中的外連接語(yǔ)法卻是Sybase式的外連接語(yǔ)法。
·Oracle不支持標(biāo)準(zhǔn)的外連接語(yǔ)法,也沒有全外連接,這是它的缺陷
字段1 = 字段2(+) (左連接)
字段1(+) = 字段2 (右連接)
·使用外連接語(yǔ)句的用處
①不想因?yàn)楸磉B接而使主表數(shù)據(jù)行丟失,這一點(diǎn)毋庸多說
①找某條記錄在A表存在,而在B表不存在,按常規(guī)做法使用not in (select 查詢子句)語(yǔ)法,
使用not in 最大的缺點(diǎn)速度慢,原因是每個(gè)數(shù)據(jù)行都去做:select 查詢子句
而使用下面的語(yǔ)法:
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
2、觸發(fā)器
·從我了解到的,MS SQL SERVER,僅有表的觸發(fā)器,而且觸發(fā)時(shí)機(jī)不夠豐富
如插入觸發(fā)在子,不區(qū)分單條插入還是多條插入,也不區(qū)分插入前觸發(fā)還是插入后觸發(fā)
碰到多條數(shù)據(jù)的插入,需要使用游標(biāo)處理每條插入的數(shù)據(jù)
·Oracle提供的觸發(fā)器不僅有基于表的觸發(fā)器,而且其他類型的,例如數(shù)據(jù)庫(kù)級(jí)的觸發(fā)器:數(shù)據(jù)庫(kù)啟動(dòng)、數(shù)據(jù)庫(kù)關(guān)閉
對(duì)于表級(jí)的觸發(fā)器,區(qū)分單條插入還是多條插入,也區(qū)分插入前觸發(fā)還是插入后觸發(fā)
3、表數(shù)據(jù)復(fù)制
·庫(kù)內(nèi)數(shù)據(jù)復(fù)制
·MS SQL Server
Insert into 復(fù)制表名稱 select 語(yǔ)句 (復(fù)制表已經(jīng)存在)
select 字段列表 into 復(fù)制表名稱 from 表 (復(fù)制表不存在)
·Oracle
Insert into 復(fù)制表名稱 select 語(yǔ)句 (復(fù)制表已經(jīng)存在)
create table 復(fù)制表名稱 as select 語(yǔ)句 (復(fù)制表不存在)
·文本文件轉(zhuǎn)入、轉(zhuǎn)出的批量處理
·MS SQL Server
BCP命令行程序
·Oracle
SQLLDR命令行程序
4、多表更新、刪除
一條更新語(yǔ)句是不能更新多張表的,除非使用觸發(fā)器隱含更新,我這里說的意思是:根據(jù)其他表數(shù)據(jù)更新你要更新的表
一般形式:
·MS SQL Server
update A
SET 字段1=B表字段表達(dá)式,
字段2=B表字段表達(dá)式
from B
WHERE 邏輯表達(dá)式
·Oracle
update A
SET 字段1=(select 字段表達(dá)式 from B WHERE ...),
字段2=(select 字段表達(dá)式 from B WHERE ...)
WHERE 邏輯表達(dá)式
從以上來看,感覺oracle沒有ms sql好,主要原因:假如A需要多個(gè)字段更新,MS_SQL語(yǔ)句更簡(jiǎn)練
你知道剛學(xué)數(shù)據(jù)庫(kù)的人怎么做上面這件事情嗎,他們使用游標(biāo)一條一條的處理
5、關(guān)于存儲(chǔ)過程或函數(shù)中使用的臨時(shí)表,兩者都提供了這個(gè)功能
臨時(shí)表,最主要的好處是,操作不留任何痕跡、不產(chǎn)生日志,
所以速度快
·MS SQL SERVER
CREATE TABLE #表名稱(........) 或者 SELECT 字段表達(dá)式列表 INTO #表名稱 FROM
表名稱前加#即可,這些臨時(shí)表都是只在一個(gè)數(shù)據(jù)庫(kù)連接會(huì)話期間有效
·Oracle
create [Global] Temporary Table ,加上[Global]就是全局的臨時(shí)表(所有數(shù)據(jù)庫(kù)連接會(huì)話都是可見的),
不則為私有的(在一個(gè)數(shù)據(jù)庫(kù)連接會(huì)話期間有效)
6、動(dòng)態(tài)執(zhí)行SQL語(yǔ)句
·MS SQL SERVER 7.0好象沒有這個(gè)功能,MS SQL SERVER 2000已經(jīng)這個(gè)功能。
你是不是想在存儲(chǔ)過程的參數(shù)中傳遞一個(gè)表名或者在過程體里動(dòng)態(tài)
生成一個(gè)SQL語(yǔ)句,你會(huì)發(fā)現(xiàn)很難辦到?戳讼旅娴睦樱耗阋郧暗膯栴}全解決了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N\'select count(*) from sysobjects\'
exec sp_executesql @SQL,N\'@i int output\',@count output
·Oracle提供了兩種方法實(shí)現(xiàn)這個(gè)功能
①程序包DBMS_SQL,執(zhí)行一個(gè)語(yǔ)句的過程:
打開游標(biāo)(open_cursor,對(duì)于非查詢語(yǔ)句,無此過程)
分析語(yǔ)句(Parse)
綁定變量(bind_variable)
執(zhí)行語(yǔ)句(execute)
關(guān)閉游標(biāo)(close_cursor,對(duì)于非查詢語(yǔ)句,無此過程)
②execute immediate ls_SQL |
|