select a.order as a_order,a.no as a_no, b.order as b_order,b.no as b_no
from a
left join b on b.order=a.order and b.no=a.no
where b.no is null
不好意思,原始的誤打where b.b.no is null, 我下where b.no is null 仍找不出我要的結果,SQL查出的結果是找不到,再麻煩您解惑,謝謝
select a.[order] as a_order,a.no as a_no, b.[order] as b_order,b.no as b_no
from a
left join b on b.[order]=a.[order] and b.no=a.no
where b.no is null
select a.[order] as a_order,a.no as a_no, b.[order] as b_order,b.no as b_no
from a
left join b on b.[order]=a.[order] and b.no=a.no
where b.no is null
我用where b.no is not null,會顯示2個資料庫符合的資料, 但用
where b.no is null 就找不到任何資料...不知哪有問題?
1.看一下 table a 和 table b的資料型態
2.檢查一下資料內容,是否有空白
null不等於空白,在資料庫他會寫一個null英文字在上面。
只要沒寫就不是。
select a.[order] as a_order,a.no as a_no, b.[order] as b_order,b.no as b_no
from a
left join b on b.[order]=a.[order] and b.no=a.no
where isnull(b.no,'')=''
1.資料欄位沒空白欄位
2.where isnull(b.no,'')='' 結果仍找不到資料
allenlwh回答的就是正確答案,利用left join或是right join時對應不到資料會是null的特性,優化差集查詢,如果要用left join去找出A、B table的差集,那算是滿普遍的寫法。
如果資料不盡你意,你也可以利用except
語法先進行排查,看看是否A、B存在差集,下b.no is null
這個條件的用意,是找出B-A
的部分,如果改成b.no > ''
,那結果應該是跟inner join是一樣的,結果應該會是A、B的交集。
結果跟你想像的不一樣,有可能有以下原因:
另外,allenlwh的程式碼有一點可以學習,當使用保留字(SSMS中看起來是藍色的)作為欄位名稱使用,盡量使用[]
包住欄位名稱,雖然MSSQL現在的優化應該不會有問題了,不過這是一個良好的程式編寫習慣,值得學習。
關於資料表集合概念,可以參考文章 : 資料表集合與文氏圖