如何将SQL关联查询返回的两行结果合并为一行?
解决SQL查询两行合并为一行的问题
嘿,我来帮你搞定这个问题!你现在的查询返回两行,大概率是因为主表MasterData.CampaignImage里同一个CampaignId+ClientID组合下有多条记录,导致自连接后生成了重复行。想要把不同ImageTypeId的图片路径放在同一行的两个列里,有两种通用的解决方法:
方法一:条件聚合(通用所有SQL数据库)
这是最灵活且兼容性最好的写法,用CASE WHEN配合聚合函数实现行转列:
SELECT CampaignId, ClientID, MAX(CASE WHEN ImageTypeId = 1 THEN ImagePath END) AS Thumbnail, MAX(CASE WHEN ImageTypeId = 2 THEN ImagePath END) AS DetailImage FROM MasterData.CampaignImage GROUP BY CampaignId, ClientID
原理说明:
GROUP BY CampaignId, ClientID会把同一组(相同CampaignId和ClientID)的所有记录合并为一行MAX(CASE ...)用来提取每组中对应ImageTypeId的ImagePath(因为每组里每个ImageTypeId应该只有一条记录,用MIN也能达到同样效果)
方法二:使用PIVOT(适用于支持该语法的数据库,如SQL Server、Oracle)
如果你的数据库支持PIVOT语法,可以用更简洁的行转列写法:
SELECT CampaignId, ClientID, [1] AS Thumbnail, [2] AS DetailImage FROM ( -- 先筛选出需要的图片类型 SELECT CampaignId, ClientID, ImageTypeId, ImagePath FROM MasterData.CampaignImage WHERE ImageTypeId IN (1, 2) ) AS SourceTable PIVOT ( -- 聚合函数用来获取对应路径 MAX(ImagePath) -- 把ImageTypeId的行值转成列名 FOR ImageTypeId IN ([1], [2]) ) AS PivotTable
这两种方法都能确保每个CampaignId+ClientID组合只返回一行,正好满足你的需求!
内容的提问来源于stack exchange,提问作者0brine




