顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2014年4月15日 星期二

[Oracle]Rownum搭配Order by的使用

之前公司的前輩寫了一段這樣的語法
想要先依p.bnd_ctrl排序(先Y再N)
然後抓第一筆的資料 結果卻不如所料

SELECT rownum,a.Prt_No, a.b_Beg_Qty, a.b_Ttl_In,p.bnd_ctrl
FROM Bnd_Phy_Analysis a, bnd_prtmst p
WHERE a.prt_no = p.prt_no
              and a.Bg_Group_Prt = 'C2PAM HEDCB-05'
              and a.Phy_No = '10303'
              and Rownum = 1
ORDER BY p.bnd_ctrl desc, (a.b_Beg_Qty + a.b_Ttl_In) desc;

Oracle 的 rownum 是一個 pseudocolumn,意思是不存在的 column,是經由計算得來的
RowNum 是先經過編號後,才再 order by name 的
如果要先 order by name 才編號,就必須下這樣的sql script

SELECT t.* FROM (
SELECT rownum,a.Prt_No, a.b_Beg_Qty, a.b_Ttl_In,p.bnd_ctrl
FROM Bnd_Phy_Analysis a, bnd_prtmst p
WHERE a.prt_no = p.prt_no
              and a.Bg_Group_Prt = 'C2PAM HEDCB-05'
              and a.Phy_No = '10303'
ORDER BY p.bnd_ctrl desc, (a.b_Beg_Qty + a.b_Ttl_In) desc) t
WHERE  Rownum = 1

Oracle官網的解說 http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

2013年12月12日 星期四

[程式語言]SQL語法:Count(*),Count(1),Count(column)

再前一家公司時,所學到的計算資料筆數的方法是使用Count(*),新公司則是看到多為Count(1),心中自然有點疑惑,便來查查吧

簡而言之
Count(*)等於Count(1),計算全部的筆數也包含空值
Count(column)會排除掉空值,也因為排除空值的動作,一般而言速度較慢,除非這個column剛好有建立index

Count(1)不代表是Count第一個Column的數目,所以第一個Clumn裡面是否有空值不會有影響

另外
如果是對特定的column做count的話,建立這個列的非聚集索引能對count有很大的幫助。
如果經常count(*)的話,則可以找一個最小的column建立非聚集索引以避免全表掃描而影響整體性能。