MySQL如何将两个查询改写为子查询关联订单表与客户表取数
SQL语句编写方案
1. 子查询实现(符合嵌入要求)
直接将获取客户名称的查询作为关联标量子查询放在SELECT字段列表中即可:
SELECT client_id, order_id, deadline, state, (SELECT name FROM clients WHERE id = orders.client_id) AS client_name FROM orders GROUP BY order_id
说明:
- 子查询中通过
orders.client_id关联外层主查询的当前行客户ID,逐行匹配获取对应的客户名称,别名为client_name - 如果部分订单的
client_id在clients表中没有对应记录,该字段会返回NULL,不会丢失原有订单数据
2. 可选:JOIN实现(执行效率更高的常用写法)
如果对性能要求更高,更推荐用左连接实现同样效果,避免逐行执行子查询的开销:
SELECT o.client_id, o.order_id, o.deadline, o.state, c.name AS client_name FROM orders o LEFT JOIN clients c ON o.client_id = c.id GROUP BY o.order_id
注意事项:
如果你的数据库开启了ONLY_FULL_GROUP_BY模式,需要确保同一个order_id下的client_id、deadline、state都是唯一值,否则非分组字段的取值可能不符合预期,建议调整分组逻辑或对非分组字段加聚合函数(比如MAX()/MIN())。
内容的提问来源于stack exchange,提问作者t1f
相关产品推荐
相关产品推荐

