1. 程式人生 > 實用技巧 >sqlserver之on與where條件

sqlserver之on與where條件

挺特別的,on後邊的條件以前我只寫一個關聯的id 之類的,後來發現還可以加條件,比如左表 使用者表,右表使用者訂單表,訂單有很多,可以加上時間範圍列出某天訂單.

很多人會說加where 就可以了,如果還要列出當日沒下單的使用者呢,where明顯就不夠了,其實在on後邊再加個時間條件就行了, left join 大家都知道,左側表資料是不管有沒有關聯上是會保留的

但加了where 條件除外.

產品表

ProNo ProName Price Stocks
00001 電視 3000.00 800
00002 空調 2000.00 500
00003 床 1000.00 300
00004 餐桌 1500.00 200
00005 音響 5000.00 600
00006 沙發 6000.00 100
00007 窗簾 500.00 100

產品入庫表

InputDate    ProNo    Quantity
2006-01-01 00:00:00.000 00001 10 2006-01-01 00:00:00.000 00002 5 2006-01-02 00:00:00.000 00001 5 2006-01-02 00:00:00.000 00003 10 2006-01-03 00:00:00.000 00001 10 2006-02-01 00:00:00.000 00003 20 2006-02-02 00:00:00.000 00001 10 2006-02-03 00:00:00.000 00003 20 2006-02-03 00:00:00.000 00004 30 2020-12-24 16:48:02.043 00001 10 2020-12-24 16:48:04.887 00001 10 2020-12-24 16:48:12.933 00002 10 2020-12-24 16:48:14.527
00002 10 2020-12-24 16:48:20.747 00003 10 2020-12-24 16:48:22.287 00003 10 2020-12-24 16:48:29.710 00004 10 2020-12-24 16:48:31.043 00004 10 2020-12-24 16:48:48.683 00004 10 2020-12-24 16:48:57.200 00005 10 2020-12-24 16:48:58.353 00005 10 2020-12-24 16:48:59.060 00005 10 2020-12-24 16:48:59.863 00005 10 2020-12-24
16:49:06.040 00006 10 2020-12-24 16:49:06.500 00006 10
select  *  from Product left join ProIn on Product.ProNo=ProIn.ProNo  and ProIn.InputDate>'20201223'

   select  *  from Product left join ProIn on Product.ProNo=ProIn.ProNo  where ProIn.InputDate>'20201223'

null沒了

看一下 sql 實行順序

查一下MSDN就清楚了整個SQL的執行順序.

http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

Processing Order of the SELECT statement
The following steps show the processing order for a SELECT statement.

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE or WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

 

也就是說, 先進行on的過濾, 而後才進行join, 這樣就避免了兩個大表產生全部資料的笛卡爾積的龐大資料.