這篇隨筆沒有什麼深奧的技術要討論,只是自己乙個知識上的盲點:不知道在access中如何進行左連線的操作。通過在網上搜尋,最後在csdn上找到了自己要的答案,因此覺得有必要記錄下來:)
最近做專案,要將乙個access中的資料匯入到oracle中。剛開始我以為用sql-server的匯入匯出工具就可以輕鬆搞定的,隨後才發現有的字段資訊不是直接匯入過來就ok的,於是又只好自己敲個程式來搞定了。
先把問題列出來:如下圖所示,一目了然,無需其他廢話了。
所以一併在這裡將oracle的左連線的操作也寫一下,算是小小的總結吧,oracle的左連線sql語句如下:
select
corpname , labor , acreage , detail
from
a , b
where
b.id
=a.id ( +)
order
byb.id
asc
access的左連線sql語句如下:
select
corpname , labor , acreage , detail
from
b left
join
a on
b.id
=a.id
order
byb.id
asc
由此也就不難推出相應的右連線操作的方法了。
問題是很容易就解決了,可是新的疑問又來了,這兩種不同的用法分別都支援什麼資料庫呢?他們之間效能有什麼優劣之分麼?於是又開始上網狂找了一通,大致理出來了自己的一點想法,也可能不對,還請各位指點則個!
一、關於外連線(outer join)sql-92標準
(sql 標準的正式名稱是iso/iec 9705 "database language sql"。最近的乙個版本被稱作iso/iec 9075:2003或簡稱為sql:2003。這個版本之前的是sql:1999 和sql-92。有興趣的可以去這裡sql standards看看不同的標準以及它們之間的差異)所定義的from子句的連線語法格式為:
from join_table join_type join_table
其中join_table
指出參與連線操作的表名,連線可以對同乙個表操作,也可以對多個表操作,對同一
個表操作的連線又稱做自連線。
join_type
指出連線型別,可分為三種:內連線(inner join)、外連線(outer join)和交叉連線(cross join)。
對於外連線,ms sql-server支援兩種形式:
1、從sybase繼承來的形式
欄位1 *= 欄位2 (左連線)
欄位1 =* 欄位2 (右連線)
這種形式沒有全外連線方式
2、標準的外連線語法
left [outer] join on expression
right [outer] join on expression
full [outer] join on expression
而對oracle來說,在8i的時候,oracle的外連線方式只有兩種:即左/右連線,到了9i以後,oracle也支援了標準的外連線語法,因而它也是兩種方式
1、欄位1=欄位2(+) (左連線)
欄位1(+) = 欄位2 (右連線)
這種形式也沒有全外連線方式
2、標準的外連線語法
left [outer] join on expression
right [outer] join on expression
full [outer] join on expression
這裡只對ms sql server和oracle進行了比較,對於其他的一些資料庫如mysql , postgresql等就沒有一一列出了。
二、關於join操作的可能優化方法
我覺得所謂的優化,還是乙個見仁見智的問題,需要根據實際的情況來進行定奪。由於自己的經驗很少,只能淺淺的說一些很常見的可以優化的地方,如果理解有誤,就請大家多多指點^_^
1、對於要經常進行join操作的多個表(尤其是資料量比較大的表),在其join操作的字段上每個表都應當建立索引;
2、在select後面不要直接就乙個select *,而只要select你需要用到的columns就夠了;
3、對於要進行join操作的表的字段應該是那種unique值居多的字段為好;
寫到這兒的時候,自己真的是想不到其他的了,於是又去網上搜尋了一下關於join performance的文章,結果真找到了一篇比較好的文章(不過是english version),我的很多想法文章裡面都包括了,文章主要是講的ms sql server中join performance的問題,但我覺得還是有普遍意義的。
大家可以到這兒看看http://www.sql-server-performance.com/tuning_joins.asp
關於oracle左連線和右連線
由於之前oracle用的比較少 只清楚 常規的左右連線寫法 今天碰到這個 的用法 一時間不知道什麼意思 後來查了一下資料發現其實 也屬於關聯表查詢的用法 感覺挺好用的 以後寫的時候回經常用一下。下面是使用demo select a.b.from a,b where a.id b.aid 號在右 表示...
內連線 左連線 左外連線 右連線的區別
一 測試例子 存在如下兩張表 年級與班級,表內容如下 班級表 二 內連線與自然連線 1 自然連線 對於select from gradeclass gc where gc.grade id in select id from grade 其結果如下圖 其查詢是把符合條件中的班級表內容全部查詢出來 而...
左連線 左外連線 右外連線
在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表b。表a結構如下 a...