首页 > 解决方案 > 带有来自 SELECT 的比较列表的 SQL NOT IN

问题描述

我有 2 张桌子。

首先是 Id 和 Name:像 TAB_FIRST.first_id 作为 INT 和 TAB_FIRST.first_name 作为 VARCHAR。

第二个表作为唯一 ID、名称和(这是关键......)一个 VARCHAR 字段,其中包含第一个表中的 Id 列表。所以这个字段包含像“26,27,29,28,25,35”这样的数据

我想从第一个表中获取数据,其中 Id 不在第二个表的 If 列表中。

如果我执行:

SELECT
first_id,
first_name
FROM TAB_FIRST
WHERE first_id NOT IN (26,27,29,28,25,35)

我工作。如果我使用 NOT IN ('26','27','29','28','25','35') 它也可以。

但是当我通过选择替换硬编码列表时,NOT IN 不会过滤数据,我会从第一个表中获取所有数据。所以:

SELECT
first_id,
first_name
FROM TAB_FIRST
WHERE first_id NOT IN (SELECT second_list_id FROM TAB_SECOND)

不起作用。

我很确定这是因为我尝试在 INT(first_id)和“字符串”列表之间执行 NOT IN。我尝试对 first_id 进行 CAT/CONVERT,尝试在列表中执行 LOCATE 添加 '' 等等。每次结果都一样。有没有办法做到这一点(不使用第三个表将第一个表中的 id 与第二个表中的 id 链接起来)。

非常感谢

标签: mysqlmariadb

解决方案


问题在于它second_list_id不是它所期望的 SQL 数组,它NOT IN只是一个带有逗号分隔 ID 的字符串,正如你所说。您需要将其解析/拆分为适当的数组,以便NOT IN匹配按预期工作。如何执行此操作取决于您使用的 SQL 方言:

另一种选择是只执行 2 个查询;第一个拉出second_list_id,然后在代码中解析它,另一个NOT IN使用解析后的 ID 列表与您一起查询。


推荐阅读