SQL Server中ON條件和WHER條件的區別:
一、ON條件是在生成臨時表時使用的條件,它不管ON中的條件是否為真,都會返回左邊表中的記錄
以 LEFT JOIN 為例,新建表Item和UOM,並插入測試數據:
1 CREATE TABLE [dbo].[Item] 2 ( 3 [ID] [INT] NULL, 4 [Item] [INT] NULL, 5 [GroupNo] [INT] NULL, 6 [UOM] [INT] NULL, 7 [ParentUOM] [INT] NULL 8 ) 9 10 INSERT INTO Item 11 SELECT 1,1,10,1,0 12 UNION 13 SELECT 2,1,10,2,1 14 UNION 15 SELECT 3,1,10,4,2 16 UNION 17 SELECT 4,2,10,1,0 18 UNION 19 SELECT 5,2,10,2,1 20 UNION 21 SELECT 6,2,10,4,2 22 UNION 23 SELECT 7,1,20,1,0 24 UNION 25 SELECT 8,1,20,2,1 26 UNION 27 SELECT 9,1,20,4,2 28 UNION 29 SELECT 10,1,30,1,0 30 UNION 31 SELECT 11,1,30,2,1 32 UNION 33 SELECT 12,1,30,4,2 34 35 CREATE TABLE [UOM] 36 ( 37 [ID] [INT] NULL, 38 [ParentUOM] [INT] NULL 39 ) 40 41 INSERT INTO UOM 42 SELECT 1,0 43 UNION 44 SELECT 2,1 45 UNION 46 SELECT 3,1 47 UNION 48 SELECT 4,2 49 UNION 50 SELECT 5,2 51 UNION 52 SELECT 6,3
1、當 Item LEFT JOIN UOM ON xxx 時,結果返回所有Item記錄,ON xxx是表關聯時的條件,根據條件Item表記錄與UOM表記錄關聯,最終只有滿足關聯條件的UOM表記錄會保留
1 SELECT A.*,B.* 2 FROM Item A 3 LEFT JOIN UOM B ON A.ParentUOM = B.ID
查詢結果:
2、ON條件不能過濾Item表記錄,即使ON條件中是Item.xxx。Item.xxx只是限定了Item表中哪些記錄參與到關聯過程,以便過濾UOM表記錄
1 SELECT A.*,B.* 2 FROM Item A 3 LEFT JOIN UOM B ON A.ParentUOM = B.ID AND A.GroupNo = 10
與1中產尋腳本不同是ON條件中增加 A.GroupNo = 10
查詢結果:
比較兩次查詢結果:2中的查詢結果,結果7-12因為GroupNo != 10,所以結果中UOM記錄全部為NULL
3、總結
LEFT JOIN 如果是想要在最終結果集過濾左表中的記錄,不能通過ON條件,需要使用WHERE條件
二、WHERE條件是在臨時表生成后,在對臨時表進行過濾時使用的條件
三、如果左表很大,而且查詢的結果相同時,使用ON條件可以減小中間臨時表的大小,使用ON條件效率比WHERE條件高