sql小坑,注意慎踩
今天在寫sql查詢的時候遇到了兩個小坑。資料庫為Mysql,持久層框架是MyBatis
第一個呢,是想使用 join 連線到其他的表,同時計算該表有關資料之和,並與另一條屬性進行求差,上sql:
SELECT DISTINCT @rownum := m.id AS seriaNum, s.store_name AS storeOrOffice, s.market AS marketName, m.amount_with_tax AS amountWithTax,
SUM(a.amount) AS mmmm, m.amount_with_tax - SUM(a.amount) AS noMatchAmount FROM biz_invoice_main m JOIN biz_store s ON s.store_no = m.store_no JOIN biz_match_amount a ON a.invoice_id = m.id
我把無關緊要的條件刪去,留下這些比較跟問題有關的sql。
可以看到,與36相關聯的兩條資料,相加之和應為300,但這條sql將資料求和之後,卻是3000。
最後發現問題還是出在 join on上,
JOIN biz_store s ON s.store_no = m.store_no
因為有兩個join on ,在執行這一句 join 的時候,因為與主表資料通過 store_no 關聯到另一個表的資料較多,有十條,導致在執行下面的 join 連線進行求和的時候,也執行了十次,於是300變成了3000。
最後將另一張表的重複資料清理掉,並對欲關聯的屬性加上了唯一約束,此sql能夠正常查詢資料了。所以在使用多條join連線,並且欲使用計算函式時,注意關聯資料最好不要有多條或者重複資料的出現,不然還是將sql分開來寫比較好。
第二個小坑依舊是這條sql,因為開發環境共用同一個資料庫,我在某個時刻,進行查詢的時候,前臺突然報了錯。
正常情況下,如果沒有查詢到相應資料的時候,頁面是醬紫的
會在table裡面有一個無資料的顯示,但是這次不一樣了
table沒有無資料的展示,並且前端還拋了異常。
比對了一下前端接收到的資料,正常的
不正常的
可以看到後臺返回的list變成了[null],於是前臺無法解析,導致異常出現了
之後查到sql,發現這樣的問題,如果不使用函式,進行查詢,沒有查詢到相應的結果的時候,是這樣的
但是如果在sql中加入了求和函式
他就變成了有一條全null資料,也就導致了我在接收sql返回的list時,收到了一個帶null的list,debug檢視此list時,idea也顯示list的siz為1,內容為all elements are null
到了這裡,就看各位大佬們想怎麼按照自己的邏輯處理了,我是在接到list之後對list內的值進行了判斷,如果為有資料並且為null,便對list進行clear,系統就能夠正常運轉了。