sqlserver之on與where條件
阿新 • • 發佈:2020-12-24
挺特別的,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 Quantity2006-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.52700002 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-2416: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, 這樣就避免了兩個大表產生全部資料的笛卡爾積的龐大資料.