SQL语句引用其他表查询ClientLog客户名称的写法是否可行及替代方案
写法可行性判断
你给出的SQL是可以正常执行的,这种写法属于关联子查询,执行逻辑是逐行遍历ClientLog表的每一条记录,到Clients表匹配和Log_Client相等的Client_ID,返回对应的Client_Name。
但该写法有两个明显限制:
- 必须保证
Clients表中每个Client_ID唯一对应一条记录,否则子查询会返回多行结果,直接触发SQL报错 - 数据量较大时执行效率极低,相当于
ClientLog有多少行,就要重复执行多少次子查询匹配Clients表
其他更推荐的实现方案
生产环境更推荐使用JOIN关联查询实现需求,优化器可以更好的生成执行计划,性能远高于关联子查询,根据需求可以选择两种关联方式:
1. 仅返回有匹配客户的日志记录(INNER JOIN)
如果不需要展示Clients表中不存在对应客户的日志,可以用内连接:
SELECT cl.Log_Number, c.Client_Name AS Log_Client, cl.Log_SalesNumber, cl.Log_ProjectNumber, cl.Log_JobType, cl.Log_Date FROM ClientLog cl INNER JOIN Clients c ON cl.Log_Client = c.Client_ID
2. 保留ClientLog全量记录(LEFT JOIN)
如果需要展示所有日志,哪怕对应的客户已经从Clients表删除也需要保留日志记录,对应客户名返回NULL即可,就用左连接:
SELECT cl.Log_Number, c.Client_Name AS Log_Client, cl.Log_SalesNumber, cl.Log_ProjectNumber, cl.Log_JobType, cl.Log_Date FROM ClientLog cl LEFT JOIN Clients c ON cl.Log_Client = c.Client_ID
如果确实需要查询ClientLog的全部字段,可以直接用cl.*代替逐个写字段,简化SQL写法。
内容的提问来源于stack exchange,提问作者CrispyCassowary
相关产品推荐
相关产品推荐

