關於SQL語句外連線中的過濾條件

2021-07-31 08:24:46 字數 1771 閱讀 2740

使用左外連線時,注意以下兩點

假設有以下兩張表

a表 id

active11

2131

40b表

idaid

active111

11210

222123

21這裡兩張表呈現為主從關係,a表為父(主)表,b表為子(副)表。

兩張表的id欄位都是主鍵,b表的aid欄位為指向a表的外來鍵。

兩張表中的active欄位表示當前記錄是否還有效。active=0表示該記錄已經被邏輯刪除。

現在要求使用左連線結合a表和b表,但是必須過濾掉各自表中已經被邏輯刪除(即active=0)的記錄。

要求的結果

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

131

錯誤的sql 1

select a.*, b.*

from a left join b

on a.id = b.aid and a.active=1 and b.active=1

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

1314

0 錯誤的sql 2

select a.*, b.*

from a left join b

on a.id = b.aid

where a.active=1 and b.active=1

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

1 正確的sql 1

select a.*, b.*

from a left join b

on a.id = b.aid and b.active=1

where a.active=1

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

131

正確的sql 2

select a.*, b.*

from a left join b

on a.id = b.aid

where a.active=1

and (b.id is null or b.active=1)

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

131

正確的sql 3

select a.*, b.*

from (select * from a where a.active=1) a

left join (select * from b where b.active=1) b

on a.id = b.aid

a.id

a.active

b.id

b.aid

b.active11

11112

12221

21232

131

sql語句的內連線外連線

假設一堆男女在教堂,有夫婦有單身的,假設男為左表,女為右表 教父說 結了婚的人請出去,結了婚的人請手拉手,於是結了婚的男女站了起來,這就是inner 內連 教父說 男的並且和這些男的結婚的女的請出去,結了婚的人請手拉手,於是,結了婚的夫婦手拉手出去,單身的男的也出去了。這就是 left 左連 教父說...

SQL查詢語句,內連線,外連線

這幾天做軟體綜合設計的專案,我負責的是服務端,因為目前打算從前端轉型到後台,所以需要補足後台相關的知識。關於專案方面的東西就不介紹了,因為文章的主題是sql,直接給出資料表的設計圖。表之間的連線線表示外來鍵。以專案中的查詢為例,講述巢狀查詢語句以及表之間的連線。1 獲取某一問題的所有回答 回答者 回...

SQL中的全外連線

今天看到一貼,說到 mysql 不支援全外連線,希望能給出乙個方法能夠解決這個問題.我們首先必須明白在數學領域,set 和 bag 是兩種不同的概念.bag 比 set 更加複雜.主要就是允許了元素的重複出現.因此 bag 的union,intersect,difference 也就有了些區別.要模...