【问题标题】:empty result when using a subquery select使用子查询选择时为空结果
【发布时间】:2020-10-29 13:45:54
【问题描述】:

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

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

table1 包含大约 5000 行,table2 包含大约 3000 行,因此我应该得到至少 2000 个“文章”值作为结果。我的查询如下所示:

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

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

当我反过来做时(即从 table2 中选择所有不在 table1 中的“文章”),它可以工作,该查询返回大约 700 个值。

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

【问题讨论】:

  • 我的第一反应是查看相关列中的数据类型是否匹配。
  • 我忘了补充一点:是的,这两列的数据类型都是varchar(32),也是相同的排序规则。

标签: mysql subquery


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的帮助!这些列中肯定没有 NULL 值,但您的解决方案有效。
【解决方案2】:

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

SELECT article FROM table1
WHERE article NOT IN
(SELECT article FROM table2 WHERE article != "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2016-07-05
    相关资源
    最近更新 更多