SQL中两种表关联方法的核心差异与优劣对比
两种SQL表关联写法的差异与优劣对比
最近我碰到个SQL关联的问题,发现有两种不同写法实现同样的需求,想弄明白它们到底有啥区别,哪种更好用。先给大家看看场景:
涉及的两张表
Table A(员工工作时长表)
| DeliveryDate | EMP | Hours |
|---|---|---|
| 5/14/2017 | 611300 | 1 |
| 5/14/2017 | 611301 | 3 |
| 5/13/2017 | 611300 | 4 |
| 5/13/2017 | 611301 | 5 |
Table B(员工路线分配表)
| Date | EMP | Route |
|---|---|---|
| 5/14/2017 | 611300 | 11101 |
| 5/14/2017 | 611301 | 11102 |
| 5/13/2017 | 611300 | 11101 |
| 5/13/2017 | 611301 | 11102 |
| 5/13/2017 | 611301 | 11103 |
注: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更值得推荐,原因很简单:
- 逻辑严谨,不会出现拼接带来的错误匹配;
- 能更好地利用数据库的索引优化,性能更稳定;
- 代码可读性更高,后期维护成本更低。
内容的提问来源于stack exchange,提问作者Rowling
相关产品推荐
相关产品推荐

