我有两个不同的表,叫做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条记录,但我多次尝试它仍然没有用,请帮帮我。
答案 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的所有行。