資料庫使用邏輯刪除時在新增查詢時遇到的問題

2022-09-12 05:18:10 字數 2129 閱讀 4406

昨天在工作的時候遇到如下的情況

現在有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'
and

u.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 刪除表 把錶的結構和表的資料一起刪除 ...