SQL如何关联同一承运商表同时获取入库、出库承运商名称
货物出入库SQL报表实现方案
核心实现思路
由于入库、出库环节的承运商信息都存储在同一张承运商主表t2中,需要对核心单据表t1做两次关联查询匹配对应名称:
- 两次关联t2表时使用不同别名,区分入库、出库承运商的匹配逻辑,避免同名字段冲突
- 使用左连接(LEFT JOIN)关联,防止未维护承运商基础信息的单据被意外过滤
- 最终输出字段严格按照需求指定的顺序排列,别名和要求的输出列名完全对齐
可直接使用的SQL代码
SELECT t1.date_in AS `DATE IN`, t1.goods AS `GOODS`, t2_in.name_shipper AS `NAME SHIPPER IN`, t1.date_out AS `DATE OUT`, t2_out.name_shipper AS `NAME SHIPPER OUT` FROM t1 -- 匹配入库承运商名称 LEFT JOIN t2 t2_in ON t1.id_shipper_in = t2_in.id_shipper -- 匹配出库承运商名称 LEFT JOIN t2 t2_out ON t1.id_shipper_out = t2_out.id_shipper;
适配调整说明
- 如果业务规则要求出入库承运商信息必须完整才展示单据,可将
LEFT JOIN替换为INNER JOIN - 若日期字段存储为时间戳或 datetime 类型,需要匹配示例中的
日/月/年格式,可使用对应数据库的格式化函数处理:- MySQL/MariaDB:替换日期字段为
DATE_FORMAT(t1.date_in, '%d/%m/%Y') AS \DATE IN`` - PostgreSQL:替换日期字段为
to_char(t1.date_in, 'DD/MM/YYYY') AS "DATE IN" - SQL Server:替换日期字段为
CONVERT(VARCHAR, t1.date_in, 103) AS [DATE IN]
- MySQL/MariaDB:替换日期字段为
- 若存在承运商ID为空、未在主表维护的场景,可使用
COALESCE(t2_in.name_shipper, '待匹配承运商')给空值设置默认展示文本,避免报表出现空值影响可读性
内容的提问来源于stack exchange,提问作者Istinger
相关产品推荐
相关产品推荐

