1. 程式人生 > >一個業務邏輯引發的對多表連接的思考

一個業務邏輯引發的對多表連接的思考

tro 完成 插入語 多表 應該 left () 業務 exec

技術分享圖片

StringBuilder sb = new StringBuilder();
sb.Append("insert into lx_ZBBaoYangLog(MatId,MatName,State,CreateTime) ");
sb.Append("select a.ID,a.EqName,0,GETDATE() from lx_Equipment as a left join lx_ZBBaoYangLog as b on a.id = b.MatId where(b.MatId is null or b.State <> 0) and NextBaoYang <= ‘" + DateTime.Now + "‘ ");

//在滿足現在時間大於保養時間的情況下,有兩種情況會被插入到保養表裏.1:該裝備在保養表裏的state=0的,2:該裝備在保養表裏沒有的
DbHelper.ExecuteSqlCommand(sb.ToString());

批量插入語句:insert into 保養表(value..)select (value...) from 裝備表

實現上面業務邏輯主要難點是在查的部分,實現---(//在滿足現在時間大於保養時間的情況下,有兩種情況會被插入到保養表裏.1:該裝備在保養表裏的state=0的,2:該裝備在保養表裏沒有的)

實現這個需求可以有兩種查的思路

1:不使用多表連接,差不多是內連接的思路(我也不知道這種說法對不對)

大概是這樣子 select(value)from 裝備表 where id not in(select matid from 保養表 where 沒有保養完成的)

2.多表連接

select value from 裝備表 left join 保養表 on 裝備表.id=保養表.Matid where (b.MatId is null or b.State<>0) and NextBaoYang<=getdate()

多表連接的方式是裝備表左連接保養表,也就是說最終會顯示裝備表裏符合的所有數據,包括了保養表裏沒有的數據,這些沒有的數據就滿足了《保養表裏不存在該裝備》這個邏輯,所以寫成b.Matld is null是正確的,也是一開始我不理解的。

我一開始的寫法我展示一下

技術分享圖片

這種寫法有兩個錯誤。

1:查不到數據:因為前面那個多表連接的裝備表和後面那個裝備表不是同一個(這個有點復雜),所以我要把b.state 放到內連接的那個()裏面作為條件而不是放在外面作為多表連接的條件

2:sql濫用,既用了多表連接又用了內鏈接,兩個沒必要放在一起,前面用了多表連接就應該在多表連接產生的那個結果裏去做文章,而不該再去搞個內連接,這樣效率低下,影響sql性能。

多表連接產生的是類似視圖一樣的虛擬表,只是用來查看的,不能用來進行其他操作,在linq時多表連接也是產生了一個新的對象,最後取得字段也應該從新對象取而不是舊的對象。

一個業務邏輯引發的對多表連接的思考