2017-06-12 85 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 
       );