mysql - 带有来自 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 链接起来)。
非常感谢
解决方案
问题在于它second_list_id
不是它所期望的 SQL 数组,它NOT IN
只是一个带有逗号分隔 ID 的字符串,正如你所说。您需要将其解析/拆分为适当的数组,以便NOT IN
匹配按预期工作。如何执行此操作取决于您使用的 SQL 方言:
- MySQL 没有内置的方法来执行此操作,但您可以查看https://blog.fedecarg.com/2009/02/22/mysql-split-string-function/以获取创建自己的示例功能来完成它。
- MS SQL Server 确实有一个可用于此目的的STRING_SPLIT方法。
另一种选择是只执行 2 个查询;第一个拉出second_list_id
,然后在代码中解析它,另一个NOT IN
使用解析后的 ID 列表与您一起查询。
推荐阅读
- php - 如果值存在或等于其中的数组,则禁用按钮 while
- c# - Microsoft.AspNetCore.Authorization.DefaultAuthorizationService - 授权失败
- django - 在 Django Admin 中注册多个模型并排除公共字段
- angular - ViewChild 与 Stepper ExpressionChangedAfterItHasBeenCheckedError Angular 8
- c++ - 为什么这些创建字符串的方法之间存在如此大的差异
- java - OnTouchEvent:我想在屏幕上用另一根手指移动时识别触摸
- tcl - 在 TCL 中,“.list”和“.desc”语法是做什么用的?我在哪里可以了解更多关于它们的信息?
- javascript - 通过 React Context API 处理 Apollo 客户端错误
- python - 在远程连接上安装 Opencv
- php - 我的 prestashop 网站一直在加载没有数据?