关联order_release_remark无匹配时如何显示view_shipment_order_release数据?
解决思路:用左外连接保留主表所有数据
这个问题的核心是连接类型的选择——你当前的查询应该用了内连接(INNER JOIN),它只会返回两张表中匹配关联条件的记录。要实现主表view_shipment_order_release的数据无论关联表有没有匹配都显示,你需要改用左外连接(LEFT OUTER JOIN,可简写为LEFT JOIN)。
针对你关联了三次order_release_remark的场景,每个关联都要单独使用LEFT JOIN,同时要注意把备注类型的筛选条件放在ON子句里(而非WHERE),避免过滤掉主表无匹配的记录。
修改后的完整查询示例
SELECT DISTINCT vsor.shipment_gid, vsor.order_release_gid, orem1.remark_text AS Related_Party, orem2.remark_text AS ULTIMATE_CONSIGNEE_TYPE, orem3.remark_text AS CONSIGNEE_TYPE FROM view_shipment_order_release vsor -- 左连接获取Related_Party类型的备注 LEFT JOIN order_release_remark orem1 ON vsor.order_release_gid = orem1.order_release_gid AND orem1.remark_type = 'RELATED_PARTY' -- 请根据实际业务的备注类型字段调整 -- 左连接获取ULTIMATE_CONSIGNEE_TYPE类型的备注 LEFT JOIN order_release_remark orem2 ON vsor.order_release_gid = orem2.order_release_gid AND orem2.remark_type = 'ULTIMATE_CONSIGNEE_TYPE' -- 左连接获取CONSIGNEE_TYPE类型的备注 LEFT JOIN order_release_remark orem3 ON vsor.order_release_gid = orem3.order_release_gid AND orem3.remark_type = 'CONSIGNEE_TYPE' -- 如果有其他全局筛选条件,放在这里,但不要过滤左连接后为NULL的字段 -- WHERE vsor.some_condition = 'xxx'
关键注意点
- 左连接的作用:每个
LEFT JOIN都会保留主表view_shipment_order_release的所有记录,即使对应的order_release_remark没有匹配行,对应的remark_text字段会显示NULL。 - 筛选条件的位置:把备注类型的判断放在
ON子句里,而不是WHERE。如果放在WHERE里,会把左连接后remark_type为NULL的记录过滤掉,变回内连接的效果。 DISTINCT的保留:继续保留DISTINCT可以避免因多表关联产生的重复行。
内容的提问来源于stack exchange,提问作者ankit singh
相关产品推荐
相关产品推荐

