理想邏輯與商務邏輯

來源:互聯網
上載者:User

today做一sql, 比較噁心。

要求倒也很簡單, 也比較常見, 就是, 比較一下一個表單是否被更改過。

如果有更改, 發信。 如果沒有, 直接審批過去。

 

這個不用多描述, 你們都懂的。

一般的做法毫無懸念, 備份啊, 做一個備份表, 比如表本身叫A, 那我們就做個preA, 每次A在update的時候都在preA裡面做個備份麼。

 

那麼問題來了:我們要把A裡的一條記錄和preA裡面的一條記錄做比較, 這可麻煩死人了。

一個一個的處理嗎?

不的, 那太累了。 有人給我出了個餿主意:

 “對於集合A和集合B, 求差異的話(去掉相同項), 只要集合A和集合B取差集,然後集合B和集合A再取差集, 然後合并, 就行了。”

 

換成sql大概就是這個樣子:

(
select * from A
except
select * from preA
)
union all
(
select * from preA
except
select * from A
)

然後我做了這麼個視圖, 比如, 叫:DiffOfA

那麼, 查一條記錄如果在這個視圖裡, 說明有差異啦!如果沒有, 那麼就說明沒有差異麼。

應用起來還不錯。 但是很快測試出問題:

當preA裡面沒有記錄的時候, 那麼!!!  這個時候會被認為有差異。。。

=。=

是啊, 從集合的角度來說一點問題都沒有, 但是從業務上來說這也忒詭異了。

 

而且實際上在我所碰到的這個系統裡面,有兩種情況會導致pre裡面沒有值。 一個當表還是處的時候, 也就是第一次插入的時候, 這時候pre裡面是沒有值的。

還有一種是流程結束的時候。 這個時候會清掉pre表。 因為它沒價值了。

 

所以這個問題就很好解決了。 改成pre和A求差集即可。 也就是把sql幹掉一半, 變成:

select * from preA
except
select * from A

搞定。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.