【问题标题】:Inner join returning all the values from two tables内连接返回两个表中的所有值
【发布时间】:2018-02-28 22:07:34
【问题描述】:

我有两张表,TableA 和 TableB,

TableA
-------------------------------------------------
Date        ORDERNUMBER PARTNUMBER  ID
--------------------------------------------------------
2017-08-16  ORD001      PART001     1         
2017-08-16  ORD002      PART002     2         
2017-08-16  ORD003      PART003     3         
2017-08-16  ORD004      PART003     4   


TableB
--------------------------------------------------------------------
Date        ORDERNUMBER PARTNUMBER  ID       PARTTYPE
---------------------------------------------------------------------
2017-08-16  ORD006      PART006     6           BAG
2017-08-16  ORD007      PART007     7           BAG
2017-08-16  ORD008      PART008     8           BAG
2017-08-16  ORD009      PART009     9           PACK
2017-08-16  ORD0010     PART0010    10          PACK

现在我想从TableB 获取值,其中OrderNumber 不在TableA 中,PARTTYPE 是“PACK”。

为此,我尝试进行内部连接,但这会带来以下结果。

SELECT * 
FROM TableA A
INNER JOIN TableB B WIT(NOLOCK) ON A.ORDERNUMBER != B.ORDERNUMBER 
                                AND B.PARTTYPE = 'PACK'
WHERE A.Date = '16 AUG 2017'

加入的结果就是一切:

Date        ORDERNUMBER PARTNUMBER  ID      Date        ORDERNUMBER PARTNUMBER  ID      PARTTYPE
----------------------------------------------------------------------------------------------------------------------------------------------
2017-08-16  ORD001      PART001     1           2017-08-16O RD009       PART009     9           PACK
2017-08-16  ORD002      PART002     2           2017-08-16O RD009       PART009     9           PACK
2017-08-16  ORD003      PART003     3           2017-08-16O RD009       PART009     9           PACK
2017-08-16  ORD004      PART003     4           2017-08-16O RD009       PART009     9           PACK
2017-08-16  ORD001      PART001     1           2017-08-16O RD0010      PART0010    10          PACK
2017-08-16  ORD002      PART002     2           2017-08-16O RD0010      PART0010    10          PACK
2017-08-16  ORD003      PART003     3           2017-08-16O RD0010      PART0010    10          PACK
2017-08-16  ORD004      PART003     4           2017-08-16O RD0010      PART0010    10          PACK

我也尝试了子查询,但我知道这是错误的:

SELECT * 
FROM TableA 
WHERE ORDERNUMBER NOT IN (SELECT ORDERNUMBER 
                          FROM TableB 
                          WHERE PARTTYPE = 'PACK')

我应该同时使用 NOT IN 和 JOINS,但就是想不到。

【问题讨论】:

    标签: sql sql-server join sql-server-2012


    【解决方案1】:

    我想从 TableB 中获取 OrderNumber 不在 TableA 中且 PARTTYPE 为“PACK”的值。

    使用not exists,这基本上看起来相当基本:

    select b.*
    from tableb b
    where parttype = 'PACK' and
          not exists (select 1 from tablea a where a.ordernumber = b.ordernumber);
    

    【讨论】:

      【解决方案2】:

      您也可以在这里进行左连接:

      SELECT b.*
      FROM TableB b
      LEFT JOIN TableA a
          ON a.ordernumber = b.ordernumber
      WHERE
          a.ordernumber IS NULL AND
          b.parttype = 'PACK'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2019-03-18
        相关资源
        最近更新 更多