1. 程式人生 > >sqlserver 聯接查詢的一些註意點

sqlserver 聯接查詢的一些註意點

運算 生成 bug nbsp rda HERE 表連接 聚合 inner

1、內連接的安全性

(1) inner join 是ANSI SQL-92 語法、等值聯接是ANSI SQL-89 的語法 ,兩者已相同方式解釋、在性能上沒有差別

(2)但是強烈建議使用ANSI SQL - 92 聯接語法、因為它更安全、 當忘記寫聯接條件、SQL-92 語法會報錯,也就是沒有ON 會報錯、這種安全實際是編碼習慣導致的

2、包含缺失值

2.1 需求

查詢TSQL2102庫中、Order表,要求20060101~20081231每天都有數據輸出、對於沒有包含訂單的日期,以NULL 標記作為訂單屬性占位符輸出

2.2 解決思路

(1)創建數字輔助表dbo.Nums , 具有n 的列,將其填充整數 123.....,使用該表生成範圍內所有日期的序列

select 
dateadd(day,n-1,20060101) as orderdate
from dbo.Nums
where n <= datediff(day, 20060101, 20081231)+1
order by orderdate;

(2) 通過Nums 和 Order 做左外連接即可

3.外部連接的邏輯順序

(1)在單表查詢中 from 、where 後面的子句具有“同時操作”的特性,但是在外聯接中,from 後面的表連接運算符,按從左往右的邏輯順序計算

(2)由於邏輯順序的存在,在外聯結多張表是要考慮到拿NULL 去做比較的情況、NULL 做比較結果一定是UNKONWN, 會被ON直接過濾掉

4、外連接使用count聚合引發的一個bug

(1) 使用外連接,若果直接使用count(*)的話,會將null也計算其中

(2) 但是如果count(col) ,且col 是外部列就不會將NULL的記錄計算進來

sqlserver 聯接查詢的一些註意點