現在是遇到這種問題,比如兩個表主表base與環節表process現在取主表base的記錄和環節號最大的記錄關聯
base表:
id,
content
process表
id,
baseid,
dealPerson,
dealTime

 

現在取process表中dealPerson不為空並且id號為最大的處理記錄
有兩種方法:
第一種

 

select base.content, process.dealPerson
from base, process
where base.id = process.baseid
and process1.dealPerson is not null
and not exists (select 1
from process1
where process1.baseid = process.baseid
process1.dealPerson is not null
and process1.id > process.id)
第二種:

 

select base.content, process.dealPerson
from base,
(select process1.baseid, process1.dealPerson
from process1
where process.id in
(select max(process2.id)
from process2
where process2.dealPerson is not null)) process
where base.id = process.baseid
 
前一種寫法效率比較高但是條件得寫兩遍,如果條件比較多,以後維護起來可能比較麻煩,第二種寫法效率灰常低。


 

第二種寫法會出現的問題:

 

表base

 

欄位 id,key,data

 

按key分組取data有最大值的記錄

 

select *
from base
where base.data in
(select max(base.data) from base group by base.key)

 

這樣寫看似沒有問題,其實如果max(base.data)有與base表的非max(base.data)有相同值得情況會出現重複記錄,比如郭key=a的時候data取2為最大,key=b的時候data取3為最大,並且key=b時data有值為2的情況,則會把data=2的這條記錄也取出來。當然如果data沒有重複記錄則不會出現這樣的問題

 

所以:正確的寫法

 

select *
from base
where base.data in
(select max(base1.data) from base base1 where base1.key = base.key group by base1.key)
 
 
 
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()