1. 程式人生 > >LEFT JOIN後AND與WHERE的異同

LEFT JOIN後AND與WHERE的異同

1AND 過濾之後再連線

2WHERE 連線之後再過濾

下面以具體例子來說明:

(1)、建表及插入測試資料

[c-sharp]view plaincopyprint?
  1. --建測試表  
  2. create table FACT_TAB  
  3. ( ID     INTEGER,  
  4.   STATUS VARCHAR2(8)  
  5. );  
  6. create table DIM_STATUS  
  7. ( STSTUS_CLASS VARCHAR2(8),  
  8.   STATUS_CODE  VARCHAR2(8),  
  9.   STATUS_DESC  VARCHAR2(8)  
  10. );  
  11. --插入測試資料  
  12. insert into FACT_TAB (ID, STATUS)values (1, '1'
    );  
  13. insert into FACT_TAB (ID, STATUS)values (2, '1');  
  14. insert into FACT_TAB (ID, STATUS)values (3, '2');  
  15. insert into FACT_TAB (ID, STATUS)values (4, '1');  
  16. insert into FACT_TAB (ID, STATUS)values (5, '2');  
  17. insert into FACT_TAB (ID, STATUS)values (6, '3');  
  18. insert into FACT_TAB (ID, STATUS)values (7, '1'
    );  
  19. insert into FACT_TAB (ID, STATUS)values (8, '2');  
  20. insert into FACT_TAB (ID, STATUS)values (9, '3');  
  21. insert into FACT_TAB (ID, STATUS)values (10, '3');  
  22. insert into FACT_TAB (ID, STATUS)values (11, '2');  
  23. insert into FACT_TAB (ID, STATUS)values (12, '1');  
  24. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('1'
    '1''正常');  
  25. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('1''2''登出');  
  26. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2''1''正常');  
  27. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2''2''登出');  
  28. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2''3''遺失');  
  29. insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2''4''未知');  
  30. commit;  

(2)、on後面and 條件表示先過濾之後,再連線

以下兩種寫法,所得的結果相同:

[c-sharp]view plaincopyprint?
  1. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  2.   FROM FACT_TAB A  
  3.   LEFT JOIN DIM_STATUS B  
  4.     ON A.STATUS = B.STATUS_CODE  
  5.    AND B.STSTUS_CLASS = '2'  
  6.    AND B.STATUS_CODE = '1'  
  7.  ORDER BY A.ID;  
  8. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  9.   FROM FACT_TAB A  
  10.   LEFT JOIN (SELECT * FROM DIM_STATUS WHERE STATUS_CODE = '1') B  
  11.     ON A.STATUS = B.STATUS_CODE  
  12.    AND B.STSTUS_CLASS = '2'  
  13. --AND B.STATUS_CODE = '1'  
  14.  ORDER BY A.ID;  

ID

STATUS_CODE

STATUS_DESC

1

1

正常

2

1

正常

3

-1

4

1

正常

5

-1

6

-1

7

1

正常

8

-1

9

-1

10

-1

11

-1

12

1

正常

(3)、on後面where條件表示先關聯之後,再過濾

[c-sharp]view plaincopyprint?
  1. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  2.   FROM FACT_TAB A  
  3.   LEFT JOIN DIM_STATUS B  
  4.     ON A.STATUS = B.STATUS_CODE  
  5.    AND B.STSTUS_CLASS = '2'  
  6.  WHERE B.STATUS_CODE = '1'  
  7.  ORDER BY A.ID;  

ID

STATUS_CODE

STATUS_DESC

1

1

正常

2

1

正常

4

1

正常

7

1

正常

12

1

正常

(4)、全值的情況

[c-sharp]view plaincopyprint?
  1. --全值的情況  
  2. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  3.   FROM FACT_TAB A  
  4.   LEFT JOIN DIM_STATUS B  
  5.     ON A.STATUS = B.STATUS_CODE  
  6.    AND B.STSTUS_CLASS = '2'  
  7.  ORDER BY A.ID;  

ID

STATUS_CODE

STATUS_DESC

1

1

正常

2

1

正常

3

2

登出

4

1

正常

5

2

登出

6

3

遺失

7

1

正常

8

2

登出

9

3

遺失

10

3

遺失

11

2

登出

12

1

正常

(5)、說明:

用到此類連線的情況,多為事實表為主表,維表為次表的程式碼關聯的連線;JOINANDWHERE的區別,其實就是主次表過濾與聯接的先後問題,這一點能認識到,所有得出的結果,都不難理解了;另外,如果主表或次表的聯接關鍵字,有多個重複記錄,則聯接的結果會催生出多條重複記錄,這就要求聯接的關鍵字根據需要須是事實上的主鍵。

:上面討論的是對輔表限制的情況,下面的是對事實表限制用on和where的情況

[c-sharp]view plaincopyprint?
  1. 1、對事實表(主表)用on  
  2. 將在結果集中過濾不滿足主表條件的輔表資訊,但因為是左連線主表的所有記錄都會顯示出來。  
  3. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  4.   FROM FACT_TAB A  
  5.   LEFT JOIN DIM_STATUS B  
  6.     ON A.STATUS = B.STATUS_CODE  
  7.    AND B.STSTUS_CLASS = '2'  
  8.       --AND B.STATUS_CODE = '1'  
  9.    AND A.ID IN ('1''2''3')  
  10.  ORDER BY A.ID;  
  11. 2、對事實表(主表)用where  
  12. 如果對主表的限制放在where裡,則不滿足主表條件的所有主表輔表資訊記錄將都不會體現在結果集中。  
  13. SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC  
  14.   FROM FACT_TAB A  
  15.   LEFT JOIN DIM_STATUS B  
  16.     ON A.STATUS = B.STATUS_CODE  
  17.    AND B.STSTUS_CLASS = '2'  
  18. --AND B.STATUS_CODE = '1'  
  19.  WHERE A.ID IN ('1''2''3')  
  20.  ORDER BY A.ID;  
  21. 注:因為對主表用ON限制沒什麼意義,所以基本上用不到。  

相關推薦

LEFT JOINANDWHERE異同

1、AND 過濾之後再連線 2、WHERE 連線之後再過濾 下面以具體例子來說明: (1)、建表及插入測試資料 [c-sharp]view plaincopyprint? --建測試表  create table FACT_TAB  ( ID     INTEGER,    STATUS VARCH

left join on and left join on where的區別

資料庫的表都是單獨存在的,但是當我們進行聯合查詢(多表查詢)時,我們獲得資料庫返回的值時就好像在一張表裡一樣,這是因為在進行聯合查詢時資料庫會生成一個臨時表返回給我們所想要的資料資訊,這時我們都是通過LEFT JOIN 等語句進行相關聯,並且我們也會為我們所想查詢的資

【mysql】mysql中left join使用on where篩選的差異

 資料表A與資料表B中資料如下:  語句一: Sql程式碼   select  A.ID as AID, B.ID as BID   from A left join B on A.ID =

hive中left/right join on連線中andwhere的使用問題

很多同學在進行表關聯的時候,and和where的使用有時候分不清,在這裡實操記錄下。 建立人員資訊表並寫入資料 create table tmp.userinfo(id string,name string,age string,dept string); insert into tmp.userinf

mysql中left join .. and where的區別

t1表: t2表: left join結果: select t1. id ,t1. name ,t2. id ,t2. name from t1 left join

sql中left join用on還是where

背景 博主開始實習工作後的第一個任務是做一個報表,要求從資料庫中拉出指定欄位以表格的形式顯示。首先吐槽下這變態的sql語句,在學校學習時,,從來沒有寫過這麼變態的sql語句。。。。感嘆讀萬卷書不如行萬里路啊,實踐出真知。 工作中使用了left join,並且在on和w

left join on andleft join on where的區別

left join on and 和 left join on where的區別   一、left join on   on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 二、left join on and &nbs

Oracle的left join中on和where的區別以及(+)的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。       在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後

left joinandleft joinwhere

--建測試表  create table FACT_TAB  ( ID     INTEGER,    STATUS VARCHAR2(8)  );  create table DIM_STATUS  ( STSTUS_CLASS VARCHAR2(8),    STATUS_CODE  VARCHAR2(8

left join 的條件 位置不同,查詢的結果不同

tab lec 條件 float text oat highlight clas sel 表t_a id name 1 a1 2 a2 表t_b a1_id name num 2 b2 1 3 b3 100 l

hive join on 條件 where 條件區別

1. select * from a left join b on a.id = b.id and a.dt=20181115; 2. select * from a left join b on a.id = b.id and b.dt=20181115; 3. select * from a jo

SQL文摘:sql(join中onwhere區別)

原文地址:https://www.cnblogs.com/wlzhang/p/4532587.html left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線

mysql left join on條件和where條件的位置作用及關係

on是在生成臨時表的時候使用的條件,不管on的條件是否起到作用,都會返回左表的行, where則是在生成臨時表之後使用的條件,此時已經不管是否使用了left join了,只要條件不為真的行,全部過濾掉。 --所以要寫在on條件之後

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

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

SQL JOIN 中 on where 的區別

相同 左連接 wid 一個 blog 區別 右連接 tro 特殊性 left join : 左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。 right join : 右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。 inner join : 內連接,

left join ,左表怎樣合併或者去掉重複記錄

在使用left join 後會發現如果右表數量有重複的話,查詢出來的數量大於左表的數量, 如 表一 test1 ID NAME SEX AGE 1 1 1 1 2 2 2 1 3 3 3 1 表二 test2 ID

Oracle的left join中on和where的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。     在使用left jion時,on和where條件的區別如下:     1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記

sql(join中onwhere區別) / NVL函式 / oracle儲存過程中is和as區別 / JAVA呼叫資料庫儲存過程

left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線,又叫等值連線,只返回兩個表中連線欄位相等的行。 full join:外連線,返回兩個表中的行:left jo

HIVE LEFT JOIN ON AND不支援非等值關聯解決辦法2

這個是在國外論壇找到的,這個方法可行----------------------------Origin SQL-------------------------------SELECT table1.id, table1.date_added, table2.date_ad

oracle的left join 的有些條件無效

Select * From (Select Rp.Module_Unique_Id, Rp.Part_No, Count(*) Over(Partition By Rp.Part_No) QtyFrom r_Wip_Panel Rp) qLeft Join c_Mod_Mod