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

SQL中两种表关联方法的核心差异与优劣对比

两种SQL表关联写法的差异与优劣对比

最近我碰到个SQL关联的问题,发现有两种不同写法实现同样的需求,想弄明白它们到底有啥区别,哪种更好用。先给大家看看场景:

涉及的两张表

Table A(员工工作时长表)

DeliveryDateEMPHours
5/14/20176113001
5/14/20176113013
5/13/20176113004
5/13/20176113015

Table B(员工路线分配表)

DateEMPRoute
5/14/201761130011101
5/14/201761130111102
5/13/201761130011101
5/13/201761130111102
5/13/201761130111103

注:EMP(员工ID)是字符串类型,Hours是数值类型;我的需求是关联这两张表,获取每个员工每天的工作时长,以及当天负责的路线数量。

两种实现代码

写法1

SELECT C.DELIVERYDATE,C.EMP,C.HOURS,D.ROUTES 
FROM ( 
    SELECT A.DeliveryDate, A.EMP, A.Hours FROM A 
) C, ( 
    SELECT B.DATE,B.EMP,COUNT(B.ROUTE) AS ROUTES FROM B group BY B.DATE,B.EMP 
)D 
WHERE C.DeliveryDate=D.DATE AND C.EMP=D.EMP

写法2

SELECT C.DELIVERYDATE,C.EMP,C.HOURS,D.ROUTES 
FROM ( 
    SELECT A.DeliveryDate&A.EMP AS DATEEMP, A.DELIVERYDATE,A.EMP,A.Hours FROM A 
) C, ( 
    SELECT B.DATE&B.EMP AS DATEEMP,B.DATE,B.EMP,COUNT(B.ROUTE) AS ROUTES FROM B group BY B.DATE,B.EMP 
)D 
WHERE C.DATEEMP=D.DATEEMP

两种写法的核心差异

其实本质上,两种写法的关联逻辑是等价的——都是基于「日期+员工ID」的组合来匹配两张表的数据,但实现方式的差别带来了几个关键不同:

  • 准确性风险:写法2用字符串拼接(&应该是你所用SQL方言里的字符串连接符,比如Access)把日期和员工ID拼成一个字段来关联,存在意外匹配的可能。比如如果有一条数据日期是'5/1/2017'、员工ID是'123',另一条数据日期是'5/1/20171'、员工ID是'23',拼接后的结果都是'5/1/2017123',就会出现错误匹配;而写法1的多字段关联完全不会有这个问题。
  • 性能表现:数据库对多字段关联的优化支持更成熟,如果你的两张表在(DeliveryDate, EMP)上建了联合索引,写法1能直接利用这个索引加速查询;而写法2的DATEEMP是计算出来的字段,除非专门建了基于这个拼接逻辑的函数索引,否则数据库只能全表扫描后再计算拼接值,数据量越大,性能差距越明显。
  • 可读性:写法1直接展示了关联的核心维度(日期+员工),其他开发者一眼就能看懂逻辑;写法2的拼接字段需要额外理解背后的关联逻辑,可读性更差。

哪种写法更优?

肯定是写法1更值得推荐,原因很简单:

  1. 逻辑严谨,不会出现拼接带来的错误匹配;
  2. 能更好地利用数据库的索引优化,性能更稳定;
  3. 代码可读性更高,后期维护成本更低。

内容的提问来源于stack exchange,提问作者Rowling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:12:21