不加临时表,参数值一定存在
时间: 2024-09-23 10:11:50 浏览: 30
SQLServer获取临时表所有列名或是否存在指定列名的方法
如果你确定`includeIds`参数值中的所有ID都存在于`pro_inventory`表的`id`列中,并且不打算使用临时表,那么可以调整查询结构,尽量避免不必要的全表扫描。下面是一个简单的建议:
```sql
UPDATE pro_inventory
SET remarks = CONCAT(remarks, #{remarks})
WHERE id IN (SELECT UNHEX(SUBSTRING_INDEX(id, ',', numbers.n + 1))
FROM pro_inventory
CROSS JOIN (SELECT a.N+1 as n
FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ... -- generate all possible values up to the maximum length of includeIds
LIMIT LENGTH(#{includeIds}) - LENGTH(REPLACE(#{includeIds}, ',', '')) + 1) a
) numbers
WHERE UNHEX(SUBSTRING_INDEX(pro_inventory.id, ',', numbers.n + 1)) LIKE UNHEX(#{includeIds}));
```
这个查询首先生成一个数字序列,然后逐个检查每个ID是否在`pro_inventory`表的`id`列中有对应的值。这种方法仍然依赖于逗号的数量来限制范围,但不涉及临时表。
然而,这种做法在`includeIds`非常长时可能会效率低下。因此,在实际应用中,如果性能至关重要且`includeIds`长度固定,可以考虑预计算一个包含所有可能ID的索引。
阅读全文