2017-06-12 83 views
0

我已經編寫了一個查詢來從WorkOrder表中也存在的Works表中選擇這些記錄。這很酷,但現在我想選擇Works中存在但不存在於WorkOrders中的記錄。爲什麼我的內部連接查詢與!=不起作用?

我已經寫了這個查詢,但是這個返回錯誤的結果。

Select w.NIT_No, w.WorkNo, wo.Amount, wo.Rate, wo.Quantity, wo.Unit, wo.ItemCode, wo.WorkOrderBoqID, 
wo.WorkOrderIssueDate from Works w 
inner join WorkOrderBOQ wo 
on w.WorkNo != wo.Work_No and w.NIT_No != wo.NIT_No 

我把!=放在ON中。

+1

我覺得這樣做是行不通的。嘗試使用LEFT JOIN獲得預期結果 – Praveen

+0

如果要比較兩個表中的記錄,爲什麼不用「EXCEPT」[除了operator-vs-in-in](https://dba.stackexchange.com/questions/83684/except-operator-vs-not-in) – Joby

+0

如果你正在命中NULL值,使用'!='不會給你所需的結果。另外,根據你想要達到的目標,你的查詢非常怪異。你只是不會找到你要找的東西。 – Jens

回答

0

所有你需要的是一個來自右表的空條目的左連接。試試這個查詢 -

SELECT w.NIT_No 
    ,w.WorkNo 
    ,wo.Amount 
    ,wo.Rate 
    ,wo.Quantity 
    ,wo.Unit 
    ,wo.ItemCode 
    ,wo.WorkOrderBoqID 
    ,wo.WorkOrderIssueDate 
FROM Works w 
LEFT JOIN WorkOrderBOQ wo ON w.WorkNo = wo.Work_No 
    AND w.NIT_No = wo.NIT_No 
WHERE wo.Work_No IS NULL 
    AND wo.NIT_No IS NULL 
3

工作。你只是希望它做一些不同的事情。它產生的每一對中兩個值不同。

你可能打算:

Select w.NIT_No, w.WorkNo, wo.Amount, wo.Rate, wo.Quantity, wo.Unit, 
     wo.ItemCode, wo.WorkOrderBoqID, wo.WorkOrderIssueDate 
from Works w left join 
    WorkOrderBOQ wo 
    on w.WorkNo = wo.Work_No and w.NIT_No = wo.NIT_No 
where wo.WorkNo is null; 

注意,從wo選擇列列並不能真正幫助任何東西,因爲他們都將NULL。所以,這個邏輯經常用not exists寫成:

Select w.NIT_No, w.WorkNo 
from Works w 
where not exists (select 1 
        from WorkOrderBOQ wo 
        where w.WorkNo = wo.Work_No and w.NIT_No = wo.NIT_Nowo.WorkNo 
       );