如何找出TripEvent表中不存在的指定Bold_ID列表项
解决方法:查找列表中不存在于TripEvent表的ID
核心思路是先构造包含所有待查ID的临时数据集,再通过左连接或EXISTS子句筛选出在TripEvent表中无匹配的ID,这样只会返回你指定列表里不存在的ID,不会扫全表返回无关数据。
方法1:使用VALUES子句+左连接(支持PostgreSQL、SQL Server 2008+、MySQL 8.0+)
SELECT t.bold_id FROM ( VALUES (354469477), (354469536), (354469500), (987359) ) AS t(bold_id) LEFT JOIN TripEvent te ON t.bold_id = te.bold_id WHERE te.bold_id IS NULL;
逻辑说明:临时数据集t包含所有你要检查的ID,和TripEvent左连接后,只有当t中的ID在TripEvent里找不到对应记录时,te.bold_id才会是NULL,筛选这些行就能得到目标结果。
方法2:使用UNION ALL构造临时表(兼容MySQL 5.x等不支持VALUES子句的版本)
SELECT t.bold_id FROM ( SELECT 354469477 AS bold_id UNION ALL SELECT 354469536 UNION ALL SELECT 354469500 UNION ALL SELECT 987359 ) AS t LEFT JOIN TripEvent te ON t.bold_id = te.bold_id WHERE te.bold_id IS NULL;
方法3:使用NOT EXISTS子句
SELECT t.bold_id FROM ( VALUES (354469477), (354469536), (354469500), (987359) ) AS t(bold_id) WHERE NOT EXISTS ( SELECT 1 FROM TripEvent te WHERE te.bold_id = t.bold_id );
逻辑说明:对临时数据集t中的每个ID,检查TripEvent里是否存在匹配记录,不存在的ID会被筛选出来。由于bold_id有唯一索引,这个查询会利用索引快速定位,效率很高。
内容的提问来源于stack exchange,提问作者Roland Bengtsson
相关产品推荐
相关产品推荐

