1

我有表 A 和表 B。我知道表 B 有 7848 行(计数(*)),我想看看表 A 中存在哪 7848 行。据我所知,INNER JOIN 返回出现在两个表 A 中的值和 B. 所以我内心是这样加入他们的:

SELECT *
 FROM 
  TABLE1 AS A
 INNER JOIN 
  TABLE2 AS B
 ON A.field1 = B.field1

此查询返回 1902 行。现在,我想找出哪些行没有出现在表 B 中,所以我这样做:

SELECT * FROM TABLE_B WHERE FIELD1 NOT IN (field1*1902....);

不同的是,我认为我应该得到 5946 行的结果,因为我发现了 1902 行。奇怪的是,这个 NOT IN 语句返回 6175 行,如果我添加它们,我得到 8077,这比 count(*) 告诉我的表 B 多。

我可能做错了什么?

提前致谢。

4

4 回答 4

2

连接是一种乘法。如果表 A 中的多行具有相同的 field1,则 B 中的行会被计算多次。

也许你想要

SELECT * FROM TABLE_B B
WHERE EXISTS (SELECT field1 from TABLE_A A WHERE A.field1 = B.field1);
于 2013-05-03T21:46:21.723 回答
1

尝试:

SELECT *
 FROM 
  TABLE1 AS A
 LEFT JOIN 
  TABLE2 AS B
 ON A.field1 = B.field1
 WHERE B.field1 IS NULL
于 2013-05-03T21:45:09.590 回答
1

以下查询返回表 A 中不在表 B 上的行:

SELECT * FROM TABLE1 WHERE field1 NOT IN (SELECT field1 FROM TABLE2)

您还可以摆脱 IN 条件以获得更好的性能:

SELECT * FROM TABLE1 A WHERE NOT EXISTS (SELECT 1 FROM TABLE2 B WHERE B.field1 = A.field1)
于 2013-05-03T21:46:45.390 回答
1

表 1 中可能有一些重复值,这些值也出现在表 2 中。您的第一个查询将多次返回这些记录。

如果您有空值,您还需要小心:INNER JOIN 和 NOT IN 不会返回这些值。

于 2013-05-03T21:58:48.570 回答