为什么我的内部联接查询与!=无效?

时间:2017-06-12 11:11:14

标签: sql sql-server tsql stored-procedures sql-server-2014

我编写了一个查询,用于从工作表中选择那些也存在于WorkOrder表中的记录。这很酷但现在我想选择那些存在于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。

2 个答案:

答案 0 :(得分: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
                 );

答案 1 :(得分:0)

您只需要一个左表连接,右表中包含Null条目。试试这个查询 -

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