LEFT JOIN 最贴近 VLOOKUP 语义,应避免 WHERE 过滤导致退化为 INNER JOIN;右表重复键需用 ROW_NUMBER() 去重;类型不一致、空格、大小写敏感须显式处理;子查询适用于单值场景但性能较差;JOIN 字段必须建索引。

LEFT JOIN 就是 VLOOKUP,别写成 WHERE 过滤
SQL Server 没有 VLOOKUP 函数,但 LEFT JOIN 的语义最贴近:保留左表所有行,右表匹配不上就填 NULL。常见错误是把匹配判断挪到 WHERE 子句里:
SELECT o.*, c.name FROM orders o LEFT JOIN customers c ON o.customer_id = c.id WHERE c.id IS NOT NULL -- 错!这等价于 INNER JOIN,丢掉查不到的订单
正确做法是让 NULL 留在结果里,后续用 ISNULL(c.name, '未匹配') 或应用层处理——这才是 Excel 中 #N/A 的真实对应。
右表重复键会导致一行变多行,必须提前去重
Excel 的 VLOOKUP 遇到重复查找值,只取第一个;SQL 的 LEFT JOIN 默认会生成笛卡尔积式膨胀。比如 products 表中多个 id = 101 的记录,orders 里一条 product_id = 101 就会变成多条结果。
- 用
ROW_NUMBER()在子查询里去重,按业务优先级排序(如最新版、最高价) - 别依赖“当前数据没重复”——上线后数据变更迟早触发问题
- 示例写法:
SELECT id, name FROM (SELECT id, name, ROW_NUMBER() OVER (PARTITION BY id ORDER BY updated_at DESC) rn FROM products) t WHERE rn = 1
类型不一致或空格会让 JOIN “静默失败”
Excel 对 "123" 和 123、"abc " 和 "abc" 有一定容错;SQL Server 的 = 判断完全严格:
Excel/WPS 公式大师。用大白话描述需求,直接给出可用的公式、函数组合和数据处理方案,并解释每一段的作用。当用户提到"Excel 公式"、"表格函数"、"VLOOKUP 怎么用"、"XLOOKUP"、"LET"、"LAMBDA"、"动态数组"、"这个公式报错了"、"#N/A"、"#REF!"、"
-
orders.customer_id是INT,customers.id是VARCHAR?必须显式转换:o.customer_id = CAST(c.id AS INT) - 从 Excel 导入的字符串常带首尾空格:
TRIM(o.code) = TRIM(c.code) - 大小写敏感?检查字段排序规则(
collation),必要时加COLLATE SQL_Latin1_General_CP1_CI_AS
嵌套子查询适合“单值返回”场景,但性能不如 JOIN
当右表逻辑复杂(比如要聚合、要跨库、要调函数),或仅需返回一个标量值(类似 VLOOKUP(..., ..., 1, FALSE)),可用子查询:
SELECT *, (SELECT TOP 1 price FROM products p WHERE p.id = o.product_id ORDER BY version DESC) AS latest_price FROM orders o
注意点:
-
TOP 1+ORDER BY是模拟“取第一个匹配”的关键,否则可能随机返回 - 子查询里不能引用外部查询的多列(如
WHERE p.id = o.product_id AND p.category = o.cat通常可行,但某些旧版本 SQL Server 会报错) - 性能比等价的
LEFT JOIN差,尤其数据量大时——每行都执行一次子查询
真正容易被忽略的是:JOIN 条件字段是否建了索引。没索引的 ON 右侧字段(如 customers.id)会让整个查询变慢十倍以上,而这个问题在小数据集里完全暴露不出来。










