我对查询返回多个结果时遇到了挑战。
SELECT DISTINCT gpph.id, gpph.cname, gc2a.assetfilename, gpph.alternateURL
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a
ON gpph.id=gc2a.id
WHERE gpph.subtype='Level_4' AND gpph.parentId=@ID AND gc2a.assettype='Primary Image'
一条记录,5679599,有2个“主要图像”,并返回该ID的2个结果,但我只需要第一个结果。有没有办法在当前查询中执行此操作?我需要写多个查询吗?
我需要一些关于如何将结果约束到主映像上的结果的方向。我已经查看了大量类似的问题,但最典型的只是要求在查询开头添加“distinct”而不是where子句。
编辑:此问题是由用户在数据库中的一条记录上输入2个主映像创建的。我的业务要求仅表明取得第一个结果。
任何帮助都会很棒!
答案 0 :(得分:2)
鉴于选择是返回的仲裁,我们可以只使用值的聚合。这需要一个group by
子句,这样就不需要使用不同的。
SELECT gpph.id, gpph.cname, max(gc2a.assetfilename), gpph.alternateURL
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a
ON gpph.id=gc2a.id
WHERE gpph.subtype='Level_4' AND gpph.parentId=@ID AND gc2a.assettype='Primary Image'
GROUP BY gpph.id, gpph.cname, gpph.alternateURL
在这种情况下,如果有多个记录,使用max(gc2a.assetfilename)
将为您提供按字母顺序排列的最高值。这不是理想的选择,某种时间戳知道记录的顺序可能更有帮助,因为那时“第一”这个词的含义可能更有意义。
答案 1 :(得分:0)
将distinct替换为group by:
SELECT MAX(gpph.id), gpph.cname, gc2a.assetfilename, gpph.alternateURL
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a
ON gpph.id=gc2a.id
WHERE gpph.subtype='Level_4' AND gpph.parentId=@ID AND gc2a.assettype='Primary Image'
AND gpph.id = MAX(gpph.id)
GROUP BY gpph.cname, gc2a.assetfilename, gpph.alternateURL