如何合并字段不同的Books与Customers表并按CustomerId统一筛选查询
实现方案
你可以通过公共表表达式(CTE)统一声明目标CustomerId,只需修改一处即可完成查询,同时保证返回字段格式和你要求的一致,参考SQL如下:
WITH query_params AS ( -- 仅需要在此处修改为你要查询的目标CustomerId SELECT 1001 AS target_cid ) -- 读取Customers表的对应记录 SELECT c.CustomerId, c.FirstName, c.LastName, c.BookTitle FROM Customers c INNER JOIN query_params qp ON c.CustomerId = qp.target_cid UNION ALL -- 读取Books表的对应关联记录,补全客户基础字段 SELECT b.CustomerId, c.FirstName, c.LastName, b.BookTitle2 AS BookTitle FROM Books b INNER JOIN query_params qp ON b.CustomerId = qp.target_cid INNER JOIN Customers c ON b.CustomerId = c.CustomerId
说明
- 如果你需要对结果中重复的书籍记录去重,把
UNION ALL替换为UNION即可,不需要去重时UNION ALL的查询性能更高 - 该写法兼容 PostgreSQL、MySQL 8.0+、SQL Server、Oracle 等所有支持CTE的主流数据库
- 如果你使用的是不支持CTE的低版本数据库,也可以用变量替代,比如MySQL低版本可以先执行
SET @target_cid = 1001;,后续两处查询条件直接引用该变量即可,同样只需要修改一次
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

