T-SQL——關於Join on的的連線條件和where的篩選條件的區分

shanzm發表於2024-09-13

目錄
  • 1.測試資料
  • 2. left join 之後ON中篩選條件
  • 3. left join之後使用where連線篩選條件

1.測試資料

WITH
temp1 AS
    (
          SELECT '張三' AS Name, 1 AS ClassNo
          UNION ALL
          SELECT '李四' AS Name, 2 AS ClassNo
          UNION ALL
          SELECT '王五' AS Name, 3 AS ClassNo
          UNION ALL
          SELECT '趙六' AS Name, NULL AS ClassNo
          UNION ALL
          SELECT '錢七' AS Name, 4 AS ClassNo
    ),
temp2 AS
    (
          SELECT '1' AS ClassNo, '一年級' AS ClassName
          UNION ALL
          SELECT '2' AS ClassNo, '二年級' AS ClassName
          UNION ALL
          SELECT '3' AS ClassNo, '三年級' AS ClassName
    )

2. left join 之後ON中篩選條件

SELECT * FROM temp1 AS a LEFT JOIN temp2 AS b ON a.ClassNo=b.ClassNo AND a.ClassNo IS NOT NULL;

結果:
Name ClassNo     ClassNo ClassName
---- ----------- ------- ---------
張三   1           1       一年級
李四   2           2       二年級
王五   3           3       三年級
趙六   NULL        NULL    NULL
錢七   4           NULL    NULL
  • on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄
  • 說明:ON是作為join語句的連線條件,這裡是left join 在說明不論ON中的條件是否符合,左表中的所有記錄都會顯示,所以這裡的a.ClassNo IS NOT NULL對最終顯示的結果是沒有作用的

3. left join之後使用where連線篩選條件

SELECT * FROM temp1 AS a LEFT JOIN temp2 AS b ON a.ClassNo=b.ClassNo WHERE a.ClassNo IS NOT NULL;

結果:
Name ClassNo     ClassNo ClassName
---- ----------- ------- ---------
張三   1           1       一年級
李四   2           2       二年級
王五   3           3       三年級
  • where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

相關文章