SQL Server:匹配地址更新RAW_INVOICES表的SITE_ID字段
请提供需要使用Markdown格式化的具体内容,我会严格按照你指定的规则进行处理。
如果是针对你之前提出的SQL问题,按照要求格式化后的回答如下:
站点ID匹配更新的高效SQL实现方案
核心逻辑
通过表关联+字符串匹配的方式实现,相比CASE WHEN更易维护且性能更优,尤其适合数据量较大的场景。核心是提取SITES表中站点名称的首词,与RAW_INVOICES表的地址字符串进行匹配,关联后更新对应SITE_ID。
具体SQL语句
1. 基础前缀匹配(MySQL语法)
适用于地址以站点首词开头的场景,能利用索引提升效率:
UPDATE RAW_INVOICES ri LEFT JOIN SITES s ON ri.ADDRESS LIKE CONCAT(SUBSTRING_INDEX(s.SITE_NAME, ' ', 1), '%') SET ri.SITE_ID = s.SITE_ID WHERE s.SITE_ID IS NOT NULL;
2. 精准独立词匹配(MySQL语法)
确保站点首词是地址中的独立单词,避免匹配到其他词汇的片段:
UPDATE RAW_INVOICES ri LEFT JOIN SITES s ON ri.ADDRESS REGEXP CONCAT('(^|\\s)', SUBSTRING_INDEX(s.SITE_NAME, ' ', 1), '(\\s|$)') SET ri.SITE_ID = s.SITE_ID WHERE s.SITE_ID IS NOT NULL;
3. PostgreSQL版本语句
UPDATE RAW_INVOICES ri SET SITE_ID = s.SITE_ID FROM SITES s WHERE ri.ADDRESS ~* CONCAT('(^|\\s)', SPLIT_PART(s.SITE_NAME, ' ', 1), '(\\s|$)') AND ri.SITE_ID IS NULL;
性能优化建议
- 为SITES表的
SITE_NAME字段建立索引,加速首词提取后的匹配过程 - 若RAW_INVOICES表数据量极大,可添加分批更新逻辑,避免长时间锁表
- 优先使用前缀匹配(
LIKE '首词%')而非全模糊匹配,能最大化利用索引
为何不推荐CASE WHEN?
当站点数量较多时,CASE WHEN需要枚举所有站点名称,导致语句冗长且难以维护;同时数据库查询优化器对CASE WHEN的优化空间远低于JOIN关联,性能差距会随数据量增大而愈发明显。
内容的提问来源于stack exchange,提问作者Pipe Pi
相关产品推荐
相关产品推荐

