LEFT OUTER JOIN加GROUP BY仍返回重复行,求解决方案
解决左连接重复行问题:仅关联SalesForce表单条记录
针对你遇到的SalesForce表重复ID导致左连接后业务表行重复的问题,以下是几种实用的解决方法:
方法1:窗口函数筛选单条记录(通用方案)
适用于MySQL 8+、SQL Server、PostgreSQL、Oracle等主流数据库,通过给每组重复ID的记录编号,只取每组的第一条:
SELECT p.*, sf.* FROM PedidosEspecialesZarateCabeceras p LEFT JOIN ( SELECT *, -- 按ID分组,给每组记录编号,ORDER BY选NULL表示随机取任意一行 ROW_NUMBER() OVER (PARTITION BY ID_SAP_BAYER__c ORDER BY (SELECT NULL)) AS rn FROM SalesForce_INT_Account__c ) sf ON p.NroClienteDireccionEntrega = sf.ID_SAP_BAYER__c AND sf.rn = 1;
如果需要固定取某一行(比如最新创建的记录),把ORDER BY (SELECT NULL)换成具体字段排序即可,比如ORDER BY CreatedDate DESC。
方法2:GROUP BY聚合(适合仅需部分字段的场景)
如果只需要SalesForce表的部分附加字段,用GROUP BY保证每个ID只返回一行,其他字段用聚合函数取任意值:
SELECT p.*, sf.ID_SAP_BAYER__c, sf.任意字段1, sf.任意字段2 FROM PedidosEspecialesZarateCabeceras p LEFT JOIN ( SELECT ID_SAP_BAYER__c, MAX(字段1) AS 任意字段1, -- 用MAX/MIN取该ID下任意值 MIN(字段2) AS 任意字段2 FROM SalesForce_INT_Account__c GROUP BY ID_SAP_BAYER__c ) sf ON p.NroClienteDireccionEntrega = sf.ID_SAP_BAYER__c;
方法3:PostgreSQL专属:DISTINCT ON
如果用的是PostgreSQL,用DISTINCT ON可以快速获取每组的第一条记录:
SELECT p.*, sf.* FROM PedidosEspecialesZarateCabeceras p LEFT JOIN ( SELECT DISTINCT ON (ID_SAP_BAYER__c) * FROM SalesForce_INT_Account__c ORDER BY ID_SAP_BAYER__c, (SELECT NULL) -- 控制取哪条记录 ) sf ON p.NroClienteDireccionEntrega = sf.ID_SAP_BAYER__c;
方法4:关联子查询取TOP 1(兼容老版本数据库)
如果数据库不支持窗口函数(比如MySQL 5.x),用子查询获取每个ID对应的任意一条主键,再关联取完整数据:
SELECT p.*, sf.* FROM PedidosEspecialesZarateCabeceras p LEFT JOIN SalesForce_INT_Account__c sf ON p.NroClienteDireccionEntrega = sf.ID_SAP_BAYER__c AND sf.主键字段 = ( SELECT TOP 1 主键字段 FROM SalesForce_INT_Account__c WHERE ID_SAP_BAYER__c = p.NroClienteDireccionEntrega );
把主键字段替换成SalesForce表的实际主键列即可。
内容的提问来源于stack exchange,提问作者FranciscoFJM
相关产品推荐
相关产品推荐

