【问题标题】:Why my inner join query with != is not working?为什么我使用 != 的内部连接查询不起作用?
【发布时间】:2017-11-13 20:15:52
【问题描述】:

我已经编写了一个查询来从表 Works 中选择那些记录,该表也存在于 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。

【问题讨论】:

  • 我认为这永远行不通。尝试使用 LEFT JOIN 获得预期结果
  • 如果你想比较两个表的记录,为什么不继续使用EXCEPTexcept-operator-vs-not-in
  • 如果您遇到任何NULL 值,使用!= 不会给您所需的结果。此外,根据您想要实现的目标,您的查询非常古怪。你只是找不到你要找的东西。

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


【解决方案1】:

它正在工作。你只是期望它做一些不同的事情。它会产生两个值不同的每一对。

你可能打算:

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
                 );

【讨论】:

    【解决方案2】:

    您所需要的只是与右表中的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多