连接表时只保留不匹配的记录

Keep only unmatched records when joining tables

我有 2 个访问 table 包含部分相似的数据,一个比另一个更丰富。 这里的想法是通过字段 idnum 连接两个 tables 并从 table T2 不在 table T1

中的数字

T1:

id num
1 34
3 51
7 23

T2:

id num status
1 34 done
1 79 done
1 39 done
3 51 done
7 23 done

预期结果:

id num status
1 79 done
1 39 done

在访问中我在互联网上看到没有像 MySQL 下那样的 MINUS 运算符,所以我尝试使用 EXCEPT 但查询需要很长时间(10 分钟后停止)

所以我尝试了这个:

SELECT T2.*
FROM T2 LEFT JOIN T1 ON (T1.id =T2.id) 
WHERE T1.num IS NULL AND ( (T2.status LIKE 'done') );

现在的问题是,我没有所有在 T2 而在 T1 中的记录

您可以使用 RIGHT JOIN。我建议在这种情况下不要使用“LIKE”,因为这很慢。您可以只使用 = 运算符。所以您的查询将是:

SELECT t2.id, t2.num, t2.status 
FROM t1 
RIGHT JOIN t2 
ON t1.id = t2.id
AND t1.num = t2.num
WHERE t1.num IS NULL
AND t2.status = 'done';

如果您要连接的所有列名在两个表中都相同,您可以更简单地连接:

SELECT t2.id, t2.num, t2.status 
FROM t1 
RIGHT JOIN t2 
USING (id,num)
WHERE t1.num IS NULL
AND t2.status = 'done';

我不喜欢这个,但它更短。最后,具体查询还是要看你个人的“品味”了。

您缺少连接条件:

SELECT T2.*
FROM      T2 
LEFT JOIN T1 
       ON T1.id  = T2.id
      AND T1.num = T2.num
WHERE T1.num IS NULL 
  AND T2.status LIKE 'done';

检查一下here

有很多变体。

SELECT t2.*
FROM t2
LEFT JOIN t1 USING (id, num)
WHERE t1.id IS NULL
  AND t2.status = 'done'
SELECT *
FROM t2
WHERE NOT EXISTS ( SELECT NULL
                   FROM t1
                   WHERE (t1.id, t1.num) = (t2.id, t2.num) )
  AND status = 'done'

还有更多变体...

这些(或其他一些)变体中哪些是最有效的?这取决于表格定义和数据统计。