遞迴
with myrecursion as(
select * from recursion where id=1
union all select r.* from myrecursion m,recursion r where m.id=r.pid
select * from myrecursion
ps:union all 不去重求並集
很多地方都用到了遞迴,比如asp.net mvc
裡的模型繫結就是遞迴繫結的,還比如樹狀選單
排名
下表是乙個銷售業績表,我對銷售業績做乙個排名,顯示出排名結果
結果:
重點是自己和自己比較,找出a1
的sales
小於a2
的sales
的資料 或者
name
和sales
都相等的資料
(a1裡的全部資料去對比
a2裡的每乙個資料)
未分組的結果:
select a1.name, a1.sales, a2.sales sales_rank
from ranking a1, ranking a2
where a1.sales
結果如圖,結果一目了然。只要分組count
一下就是排名了。
其實還有乙個問題就是有並列排名,比如上圖中有個並列第3
的,第四名就不存在了。
這些都可根據具體的規則用程式去調整,嘻嘻
去重
有時我們會遇到一些表裡有些重複的資料,如圖:
第一種,去除全部重複的資料除id
以外declare @t1 table(id int,name nchar(10),text nchar(10))
insert into @t1(name,text)(select distinct name,text from mydistinct1)
delete from mydistinct1
insert into mydistinct1(name,text)(select name,text from @t1)
ps:@t 定義乙個虛擬表,向虛擬表裡插入用
distinct
去重的資料,清空原表,再把虛擬表裡的資料插入到原表。
第二種,去除指定列重複的資料。
delete from mydistinct where id not in(select min(id) from mydistinct group by name)
ps:sql很簡單,分組後取分組裡乙個
id,這裡取最小的乙個,刪除除此之外的
id行轉列
select 姓名 as 姓名 ,
max(case 課程 when '語文
' then 分數 else 0 end) 語文,
max(case 課程 when '數學
' then 分數 else 0 end) 數學,
max(case 課程 when '物理
' then 分數 else 0 end) 物理
from tb
group by 姓名
結果如圖:
ps:一目了然就不多解釋了
for xml path 現實分組後指定列的全部資料
資料表:
for xml path 結果如下:
分組結果:
分組後除此分組列,其他列要顯示就要使用聚合函式,只能顯示結果中的乙個或數量或合計
我們可以利用for xml path
的特性把全部資料都顯示在一列中,並指定顯示格式
逗號間隔:
select text+',' from forxmlpath for xml path('')
逗號間隔顯示分組後非分組列:
select name,(select text+',' from forxmlpath where a.name=name for xml path(''))
from forxmlpath a group by name
去掉結尾的逗號:
使用 left
函式擷取
select name,left(text,len(text)-1)text
from(select name,(select text+',' from forxmlpath where a.name=name for xml path('')) text
from forxmlpath a group by name)t
幾個比較有意思的邏輯問題
誠實者與說謊者的問題 現有a和b兩扇門,其中有乙個是我要開啟的,即正確的門,有乙個是錯誤的門,有兩個守門員a和b,他們兩都知道正確的門和錯誤的門,他們會告訴你答案但是它他們有乙個是誠實的,有乙個是說謊的。現要求,只能問他們其中乙個人乙個問題,怎麼才能開啟正確的門。海盜分金問題 5個海盜 abcde ...
程式設計是比較有意思的事情
這些天一直在實驗室幹活,忙得不行,所以也沒時間來寫部落格,今天有時間了,先寫點對程式設計的體會。最近逐漸感覺程式設計是比較有意思的事情,它有意思在於讓我們比較有創造力。記得上個學期一來,由於深感教育網上國外 要上 上國內網 特別是教育網的 為了速度又要去掉 的麻煩,於是就寫了乙個ie的 指令碼,到網...
較有意思的表定義
create table employees empno number 4 constraint e pk primary key constraint e empno chk check empno 7000 ename varchar2 8 constraint e name nn not nu...