近期在給客戶做新數據交換方案調試時發現一處視圖創建語句帶不出數據。 精簡需求後如下:a部門從b部門獲取主體數據,由於a、b兩部門有些代碼標準不一致需要做轉換。於是開發寫了個對照表做轉換生成業務視圖。 主表zb數據如下,B_MD1和B_DM2是兩種類型代碼,分別是lx1和lx2(比如一個是證件類型代碼 ...
近期在給客戶做新數據交換方案調試時發現一處視圖創建語句帶不出數據。
精簡需求後如下:a部門從b部門獲取主體數據,由於a、b兩部門有些代碼標準不一致需要做轉換。於是開發寫了個對照表做轉換生成業務視圖。
主表zb數據如下,B_MD1和B_DM2是兩種類型代碼,分別是lx1和lx2(比如一個是證件類型代碼一個地址行政區劃代碼)。主表某些欄位有缺失數據的情況。
為圖省事,開發將不同類型的代碼對照表記錄在同一張對照表(dzb)中,如下圖
業務需求是創建視圖查出所有主表的數據,允許出現某些欄位數據缺失的情況。並將兩部門標準不一致的代碼做轉換。然後開發這貨寫出瞭如下視圖。
CREATE VIEW V_ZB AS SELECT ZB.ID, ZB.NAME, LX1.A_DM DM1, LX2.A_DM DM2 FROM ZB LEFT JOIN DZB LX1 ON ZB.B_DM1 = LX1.B_DM LEFT JOIN DZB LX2 ON ZB.B_DM2 = LX2.B_DM WHERE LX1.LX = 'lx1' AND LX2.LX = 'lx2';
得到如下結果。什麼......李四去哪了?Σ( ° △ °|||)︴調試的時候是一萬多主表數據,視圖裡一條都沒能查出來。(╯°Д°)╯︵┻━┻(
/*原因是where條件那裡篩去了未連接上的數據,就是left join 變成join了。where條件那裡使用對照表的lx篩選本意是想獲取不同類型的對照數據(如證件類型對照、地址行政區劃對照)拿來做左連接。但沒連接上的對照表類型值都是null,又怎麼經得起lx=某類型的篩選呢? 真實業務場景中由於某個欄位經常缺數,加上需要對照轉換的欄位比較多,所以一條數據都出不來。 這種情況還是老老實實拆分成證件類型對照表、地址行政區劃對照表這樣不同的對照表。或者篩選lx=類型那裡加多一個 or is null。*/ CREATE VIEW V_ZB AS SELECT ZB.ID,ZB.NAME,LX1.A_DM DM1,LX2.A_DM DM2 FROM ZB LEFT JOIN DZB LX1 ON ZB.B_DM1=LX1.B_DM LEFT JOIN DZB LX2 ON ZB.B_DM2 = LX2.B_DM WHERE (LX1.LX='lx1' OR LX1.LX IS NULL) AND (LX2.LX='lx2' OR LX2.LX IS NULL);原因是...
修改後,得到如下圖的結果就合適了(๑•̀ㅂ•́)و✧
-------------------------------------------------------------------------------------------
@luqp 本文地址 https://www.cnblogs.com/lucky-pin/p/10740481.html