You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:13:29