如何从一个表中选择不在其他表中的所有行?

Posted

技术标签:

【中文标题】如何从一个表中选择不在其他表中的所有行?【英文标题】:How to select all rows from a table which are not in other table? 【发布时间】:2021-01-07 14:43:56 【问题描述】:

我在 mysql 数据库 (mariaDB) 名称 productsorder 中有 2 个表。 在产品表中有 productid 列,其类型为 int(11) 并设置为主键以及自动增量。虽然订单表有 productid 列的引用 名称是不相同,并且没有使用外键。 order表中的列名设置为pid,类型为varchar

我想要 products 表中 productid 不存在于 order 表中的所有行。

这个数据库被安卓应用程序和网络应用程序使用。所以像重命名列这样的重大改变是不可行的。

我目前的方法是使用编程。从products 中获取所有productid 的列表,然后在order 表中一一搜索。这需要很多时间,因为表中的产品数量约为 500k 有没有其他方法可以做到这一点?

【问题讨论】:

请注意,order 是 MySQL 中的保留字,使其作为表/列标识符的选择很糟糕。如需更多帮助,请参阅meta.***.com/questions/333952/… 【参考方案1】:

您可以简单地进行查询以获取产品:

SELECT products.productid, order.orderid 
FROM products
LEFT JOIN order ON order.pid = products.productid
WHERE order.orderid IS NULL

【讨论】:

【参考方案2】:

您可能想查看“存在”语句。

您的请求如下所示

SELECT * 
FROM products
WHERE 
    NOT EXISTS 
     (SELECT 1 FROM orders 
      WHERE orders.productid = products.productid);

还有其他可能性,我不是 DB 方面的专家,无法进一步讨论它们的优点,但您可以在 Subqueries with EXISTS vs IN - MySQL 上阅读更多相关信息。根据我自己的经验(可能与您的相同或不同),我发现使用“EXISTS”更容易阅读且性能足够

【讨论】:

【参考方案3】:
SELECT products.productid 
LEFT JOIN `order` 
ON(products.productid=CAST(`order`.pid AS INTEGER))
WHERE `order`.pid is null;

【讨论】:

以上是关于如何从一个表中选择不在其他表中的所有行?的主要内容,如果未能解决你的问题,请参考以下文章

即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?

从 id 不在 id 列表中的表中选择

T-SQL:如何在值列表中选择不在表中的值?

如果当前表中不存在,则从其他表中选择行

如何选择 SQL 数据库表中的第 n 行?

hibernate:如何选择表中的所有行