1. 程式人生 > >關於SQL語句外連線中的過濾條件

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

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

  • 第一張表的過濾條件寫在where子句中
  • 其餘各張表的過濾條件寫在on子句中

假設有以下兩張表
A表

id active
1 1
2 1
3 1
4 0
B表
id aid active
11 1 1
12 1 0
22 2 1
23 2 1
這裡兩張表呈現為主從關係,A表為父(主)表,B表為子(副)表。
兩張表的id欄位都是主鍵,B表的aid欄位為指向A表的外來鍵。
兩張表中的active欄位表示當前記錄是否還有效。active=0表示該記錄已經被邏輯刪除。
現在要求使用左連線結合A表和B表,但是必須過濾掉各自表中已經被邏輯刪除(即active=0)的記錄。
要求的結果
A.id A.active B.id B.aid B.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 1
3 1

錯誤的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.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 1
3 1
4 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.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 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.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 1
3 1

正確的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.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 1
3 1

正確的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.active
1 1 11 1 1
2 1 22 2 1
2 1 23 2 1
3 1

相關推薦

關於SQL語句連線過濾條件

使用左外連線時,注意以下兩點 第一張表的過濾條件寫在where子句中其餘各張表的過濾條件寫在on子句中假設有以下兩張表 A表 id active 1 1 2 1 3 1 4 0 B表 id aid active 11 1 1 12 1 0 22 2 1 23 2 1 這

工作總結 sql 過濾條件 的 (where的) and

sts 如果 9.png 聯系 .com 處理 src 分享圖片 http 總結: 在where 後面做過濾的時候 如果 有 字段1 必須滿足某種值 字段2 要滿足 某種或某值的時候 直接 and 字段1 = ‘a’ an

Oracle連線對非連線條件使用(+)需要注意的地方

1.先來說下Oracle外連線語句中對非連結條件使用(+)的作用問題 之前問過朋友,當時大腦處於短路狀態,居然沒想明白作用是啥。先看例子如下: select * from dept,emp where dept.deptno=emp.deptno(+) and emp.en

phpmysql一條sql語句查詢出所有符合條件的資料,該怎麼寫?

假如一個表裡有個classid欄位是類別的id,我想用一條sql語句查出classid=5的所有資料的id該怎麼查呢?正常是要迴圈,放到數組裡的吧 如圖,我想查詢classid=2的對應所有id,用

sql語句刪除庫所有表

eal stat sele select objects alloc eight rain 過程 1 --/第1步**********刪除所有表的外鍵約束*************************/ 2 use DCCalc_Engine 3 GO 4 D

Sql語句中用別名作判斷條件

當我們使用某個表示式作為輸出的一列時,我們無法再Where條件中直接使用該列作判斷條件.    例如下面的SQL語句: select id, (c1 + c2) as s from t1 

前端之路:sql語句,表隨機獲取一條記錄(資料)。(或者獲取隨機獲取多條(記錄)資料)

<!--表中獲取隨機一條title 耗時0.01s id==隨機欄位,最好為表id--> SELECT * FROM `tableName` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `ta

資料庫效能之SQL語句優化(

百萬級資料優化 一.I_IPTVLOGIN00 (五十萬),TEMP_STBINFO (五百萬) 1.select a.loginAccount,a.stbID,b.DEV_SNO from I_IPTVLOGIN00 a,TEMP_STBINFO b where a.s

Zoey.Dapper--Dapper擴充套件之把SQL語句放到檔案

介紹 不知道大家在用Dapper的時候SQL語句是寫到哪的,目前看網上的例子都是寫到類裡面的. 此專案的目的是把SQL語句放到檔案(xml)中 目前只是初步版本,只是說明了意圖,後面會持續完善和優化 功能說明 SQL 語句單獨存放在檔案(xml)中 支援配置多資料夾(暫不支援指定具體檔案) 實時監

SQL語句向表格插入資料

向表格中插入資料 SQL語言使用insert語句向資料庫表格中插入或新增新的資料行。Insert語句的使用格式如下:  insert into tablename  (first_column,...last_column)  values (first_v

Sql語句在日期新增或減去指定的時間

SQL語句使用DATEADD得到一個時間加上或減去指定天數之後的時間。也適用於小時、分鐘、秒鐘等等DATEADD() 函式功能:在日期中新增或減去指定的時間間語法:DATEADD(datepart,number,date)date 引數是合法的日期表示式。number 是您希

SQL語句Left join On和Where的用法區別

如果SQL用的是Left Join ,On後面的條件對Left的表沒有作用,只對Right的表有過濾作用,Where語句可以對Left的表有過濾作用 如果SQL用的是Right Join ,On後面的條件對Right的表沒有作用,只對Left的表有過濾作用,Where

oracle 編寫sql語句獲取表的最後一條資料

select p.* from (select * from t_cfg_menu t order by t.menu_id desc) p where rownum = 1 首先查詢表中資料按降序排列,然後通過“rownum = 1”獲取第一條資料,即是原

(轉貼)SQL連線,右連線,全連線,內連線

http://www.blogjava.net/zolly/archive/2007/10/23/SQLJION.html   聯接條件可在 FROM 或 WHERE 子句中指定,建議在 FROM 子句中指定聯接條件。WHERE 和 HAVING 子句也可以包含搜尋條件,以進一步篩

如何用一條sql語句刪除表所相同的記錄?

刪除重複資料  一、具有主鍵的情況  a.具有唯一性的欄位id(為唯一主鍵)  delete table  where id not in  (  select max(id) from table group by col1,col2,col3...  )  group by 子句後跟的欄位就是你用來判斷

Qt使用QSqlTableModel執行SQL語句,QLineEdit輸入查詢條件完成查詢功能

void ConnectDb::dbTableView() {QSqlTableModel *model;QString sName, sAge, sHeight, sSex;int nAge = 0, nHeight = 0;model = new QSqlTableModel(this);model-&g

常用SQL語句例項(含過濾及刪除重複資料、匯入匯出資料等)

本文整理一些常用的SQL語句例項(如過濾重複資料、刪除重複資料、匯入匯出資料等),收藏備用,不斷更新中……。歡迎訪問作者網站獲取最新版:http://hi.wonsoft.cn -------------------------------第一部份 高階技巧-------

如何用sql語句對性別的 約束條件讓它只能填 男 或 女

clas nsh 希望 net 我們 大神 ons const 約束 ALTER TABLE tb WITH NOCHECK ADD CONSTRAINT col1_check CHECK (性別 in(‘男‘,‘女‘))

SQL連線,右連線,全連線,內連線

      連線條件可在FROM或WHERE子句中指定,建議在FROM子句中指定連線條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選連線條件所選的行。          連線可分為以下幾類:        內連線。(典型的連線運算,使用像   =   或   <>   之類的比較

利用native SQL實現連線查詢

String sql ="select s.serviceid as serviceid ,s.servicename,count(o.id) as amount  from service as s left join orderrelation as o on (s.se