使用子查询选择时,结果为空

时间:2020-10-29 13:45:54

标签: mysql subquery

我在数据库中都有两个表(table1,table2)(均为InnoDB类型)。他们都有一列“文章”。在表1中,“文章”是主索引,在表2中,“文章”被定义为“唯一”。这两个列的数据类型均为varchar(32),排序规则也相同。

我正在尝试获取表1中所有“文章”值的列表,但不在表2中。

table1包含约5000行,table2包含约3000行,因此,我应至少获得2000个“ article”值。我的查询看起来像这样:

SELECT article FROM table1
WHERE article NOT IN
(SELECT article FROM table2);

但这将返回一个空结果...

当我以另一种方式执行此操作(即从table2中选择所有不在表1中的“文章”)时,它起作用了,该查询返回了大约700个值。

我认为这必须与两个表中“文章”的不同索引/唯一状态有关。但是如何修改查询以使其正常工作?

2 个答案:

答案 0 :(得分:1)

请改用left join。无论如何,它具有许多值会更快:

SELECT t1.article 
FROM table1 t1
LEFT JOIN table2 t2 ON t1.article = t2.article
WHERE t2.article IS NULL

答案 1 :(得分:0)

我自己找到了第二个解决方案(尽管已接受的答案完全起作用):显然,在这种情况下,子查询需要一个WHERE子句才能使整个查询正常工作。因此,我添加了一个WHERE子句,该子句将应用于table2(即WHERE article != "")中的 all 行。因此,完整的(有效的)查询现在看起来像这样:

SELECT article FROM table1
WHERE article NOT IN
(SELECT article FROM table2 WHERE article != "");
相关问题