昨天在工作的時候遇到如下的情況
現在有2張表
user
doctor_team_member
id
id
name
team_id
hospital_id
hospital_id
delete_***
delete_***
doctor_id
user表存的是所有的醫生使用者,doctor_team_member 存的是 所有醫院裡面已經編入了團隊的醫生。
現在需要查詢出某個醫院下面所有沒有加入任何團隊的醫生。
1.0 版本 是這樣的:
select*from
user
uleft
join doctor_team_members dtm on u.id =
dtm.doctor_id
where
dtm.team_id
isnull
andu.hospital_id
=73603893786841088;
這就是忽略了delete_***=1被邏輯刪除的使用者 。當有個使用者被邏輯刪除的時候,但在篩選的時候,
篩選不出被邏輯刪除的使用者。因為被邏輯刪除的使用者在doctor_team_members
表中是有資料的可以和
user.id 關聯上。
然後就是2.0版本:
select*from
user u
left
join
doctor_team_members dtm on u.id =
dtm.doctor_id
where
(dtm.team_id
isnull
or dtm.delete_*** ='1
')andu.hospital_id
=73603893786841088;
這樣就可以把被邏輯刪除的使用者再篩選出來。 但現在又出現了新的問題,假如我們新增乙個 doctor_team_members
資料後。再把他邏輯刪除掉,然後我們再新增同乙個醫生加入 doctor_team_members 。現在資料庫裡面,有乙個邏輯刪除
的醫生和乙個同名同id 的新加的醫生。這個時候問題就出現了,我們再次查詢的時候,那個醫生就會出現在該醫院下未加入
任何團隊的名單裡面。當我們再邏輯刪除他的時候再查詢,還有出現多個同名醫生的情況。那些多出來的醫生就是delete_***='1'的
醫生且同乙個的醫生。
然後就是最終解決方案。完全排除delete_***='1'的醫生
select*from
action_user u
left
join
doctor_team_members dtm on u.id = dtm.doctor_id and dtm.delete_*** ='0
'where
dtm.team_id
isnull
and u.delete_*** = '0'
andu.hospital_id
=73603893786841088;
在關聯表的時候就把delete_*** ='1'的資料去掉,然後再執行 where 的條件進行篩選。這樣就不用受 delete_***='1'的影響了。
總結:
就放在 on 的條件裡面,先on 再 where 。 (忽視了on 和 where 的執行順序讓我腦殼疼了很久)
新增查詢刪除資料
package demo1 leo description 暫無 date created in 2020 11 27 18 03 public class mylist public mylist object element get set方法 public object getelement ...
資料庫新增資料 刪除 查詢
在資料庫中新增資料 指定字段新增 insert into 表名 欄位名1,欄位名2 values 值1,值2.新增多段 這種寫法的值要對應著表字段順序 insert into 表名 values 值1,值2,值3.在資料庫中更新資料 update 表名 set 修改值 where 約束條件 在資料庫...
建立和刪除表,新增 查詢 修改和刪除資料
建立資料庫 create database 建立表 建立表 use gocreate table 使用某個資料 heroid int name varchar 50 nickname varchar 50 char 2 sal int bir datetime 刪除表 把錶的結構和表的資料一起刪除 ...