這輩子寫過的比較有意思的幾個sql

2022-07-06 22:42:19 字數 3330 閱讀 2183

遞迴

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...