這個問題出現在多表關聯時, 如一張商品表,其中的單位的字元串表示是在單位表中, 但這個單位的id之後進行了刪除,並且不再奏效。 如下: select * from (select pg0.id,pg0.init_size,pg0.goods_id, pg0.goods_move_size,pg0.e ...
這個問題出現在多表關聯時,
如一張商品表,其中的單位的字元串表示是在單位表中,
但這個單位的id之後進行了刪除,並且不再奏效。
如下:
select *
from (select pg0.id,pg0.init_size,pg0.goods_id,
pg0.goods_move_size,pg0.execution,pg0.operation,
pg0.create_time,pg0.update_time
from psog_purchase_log pg0 where pg0.is_del=0
and pg0.store_log_id = 15)pg
left join psog_goods g on pg.goods_id = g.id
left join psog_cate c on g.cate_id = c.id
left join psog_unit u on g.unit_id = u.id
where g.is_del = 0 and c.is_del = 0 and u.is_del = 0
可以看到最終where語句判定u.is_del=0,判定單位表不為空
但其實有時要查詢的是一些記錄數據,可能跟這個值關係不大,及時後來商品單位為空了也無所謂,
那麼就可能改為下麵這樣:
select *
from (select pg0.id,pg0.init_size,pg0.goods_id,
pg0.goods_move_size,pg0.execution,pg0.operation,
pg0.create_time,pg0.update_time,pg0.is_del
from psog_purchase_log pg0 where pg0.is_del=0
and pg0.store_log_id = #{storeLogId})pg
left join
(select g0.id,g0.cate_id,g0.unit_id,g0.goods_name,g0.goods_code,g0.is_del from psog_goods g0 where g0.is_del=0)g
on pg.goods_id = g.id
left join
(select c0.id,c0.is_del,c0.cate_name from psog_cate c0 where c0.is_del=0)c
on g.cate_id = c.id
left join (select u0.unit,u0.id,u0.is_del from psog_unit u0 where u0.is_del=0)u
on g.unit_id = u.id
可以看到上面每個判定數據有效的is_del在單獨的關聯時就已經做了排查,
這樣的作用是基於最left的表為基準,之後的即使未關聯到的某id=某id,
那麼要查詢的select * 裡面的數據只變為空,而該行數據以最左邊的表,即pg表為基準不管其它關聯與否,要查詢的
欄位空與不空關係不是太大。
總結:
上面的sql查詢時必須要能關聯到類似商品分類商品單位名稱的等等數據時才可以,否則那一行不予返回
而下麵的這個sql只要pg表能查到那麼之後的不管子表數據刪除了沒有,主表的數據還會展示