我在数据库中都有两个表(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个值。
我认为这必须与两个表中“文章”的不同索引/唯一状态有关。但是如何修改查询以使其正常工作?
答案 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 != "");