如何比较两个不同的表找出其余的记录

时间:2017-05-04 09:50:22

标签: sql sql-server

我有两个不同的表,叫做tableA和tableB,我想比较这两个表。 结构如下:

tableA使用以下查询有511条记录

SELECT count(*)
  FROM tableA
  WHERE [ID_NAME] = 'a06'

tableB使用以下查询有507条记录

SELECT count(*)
  FROM tableB
  where [FILENAME] like 'a06%' and [TIME] = '201705'
我想比较这两个表使用公共列PNO,我使用下面的查询可以找到这两个表交集(507条记录):

SELECT count(*)
FROM tableA
WHERE PNO IN (SELECT PNO
                 FROM tableB
                 WHERE [FILENAME] like 'a06%' and [TIME] = '201705')

现在,我该怎么办?我认为使用左连接可以找出其余的4条记录,但我多次尝试它仍然没有用,请帮帮我。

3 个答案:

答案 0 :(得分:1)

您可以通过多种方式实现这一目标,使用_creplace_char(&connstr, ';', '\0'); 就是其中之一:

left join

请注意,之前在SELECT ta.* FROM tableA ta LEFT JOIN tableB tb ON ta.[PNO] = tb.[PNO] and ta.[ID_NAME] = 'a06' and tb.[FILENAME] like 'a06%' and tb.[TIME] = '201705' WHERE tb.[PNO] is null 子句中的条件现在已在连接条件中移动;这是因为WHERE会将LEFT JOIN值分配给不匹配的行,但如果您过滤右表中的某些字段,则此功能会丢失。< / p>

修改

另一个选项是使用您用于查找交叉点的相同路径,只需在NULL上添加条件并将tableA更改为IN

NOT IN

答案 1 :(得分:0)

基本上你想做A-B

   SELECT *
    FROM tableA t1
    WHERE t1.PNO Not IN (SELECT PNO
                     FROM tableB
                     WHERE [FILENAME] like 'a06%' and [TIME] = '201705')
  

OR

   SELECT *
    FROM tableA t1
    WHERE t1.PNO EXCEPT
      (SELECT *
       FROM tableB
             WHERE [FILENAME] like 'a06%' and [TIME] = '201705')

答案 2 :(得分:0)

假设您使用的是SQL Server 2008 +

SELECT PNO FROM TABLE A 
INTO #TEMP_A
EXCEPT
SELECT PNO FROM TABLE B

将返回不在两个表中的PNO

SELECT  *
FROM    tableA
WHERE   PNO (Select PNO from #TEMP_A)

将返回表A中缺少PNO的所有行。