基于另一表数据的SQL计算字段:自动化填充Speed Control列
最优实现方案:匹配Tag数字部分更新Speed Control列
需求回顾
现有两张业务表:
- Engineering表
| Tag | Speed Control |
|---|---|
| PC-1234 | |
| ME-1235 | |
| BF-1236 |
- Instrumentation表
| Function | Tag |
|---|---|
| SC | 1234 |
| SC | 1235 |
| SC | 1237 |
需实现自动化逻辑:若Instrumentation表中存在Function='SC'且Tag与Engineering表Tag的数字部分匹配,则将Engineering表的Speed Control设为Yes,否则设为No。
分数据库类型实现方案
1. MySQL/MariaDB
利用SUBSTRING_INDEX提取Tag的数字部分,结合EXISTS子查询判断匹配:
UPDATE Engineering e SET `Speed Control` = CASE WHEN EXISTS ( SELECT 1 FROM Instrumentation i WHERE i.Function = 'SC' AND i.Tag = SUBSTRING_INDEX(e.Tag, '-', -1) ) THEN 'Yes' ELSE 'No' END;
2. SQL Server
用RIGHT和CHARINDEX组合提取数字部分:
UPDATE e SET [Speed Control] = CASE WHEN EXISTS ( SELECT 1 FROM Instrumentation i WHERE i.Function = 'SC' AND i.Tag = RIGHT(e.Tag, LEN(e.Tag) - CHARINDEX('-', e.Tag)) ) THEN 'Yes' ELSE 'No' END FROM Engineering e;
3. PostgreSQL
使用SPLIT_PART拆分Tag字符串获取数字部分:
UPDATE Engineering e SET "Speed Control" = CASE WHEN EXISTS ( SELECT 1 FROM Instrumentation i WHERE i.Function = 'SC' AND i.Tag = SPLIT_PART(e.Tag, '-', 2) ) THEN 'Yes' ELSE 'No' END;
方案优势说明
- 采用
EXISTS子查询做匹配判断,相比JOIN关联更高效,找到匹配项后立即停止检索,减少不必要的计算 - 针对不同数据库的字符串特性选择对应函数,确保Tag数字部分提取准确
- 通过
CASE语句批量处理全表数据,一次性完成自动化更新,无需手动逐条操作
内容的提问来源于stack exchange,提问作者Drafter-SQL
相关产品推荐
相关产品推荐

