2012-11-08 85 views
0

我对我的查询有一个挑战,返回多个结果。Select Statement with distinct returns multiple rows and need only first result

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 [email protected] AND gc2a.assettype='Primary Image' 

result set

A记录,5679599,具有2 '主映像',并返回2个结果那个ID,但我只需要第一个结果返回。在当前查询中有没有办法做到这一点?我是否需要编写多个查询?

我需要关于如何将结果限制为主图像上只有1个结果的一些指示。我研究了大量类似的问题,但最典型的情况是只需要在查询的开头添加“distinct”而不是where子句的指导。

编辑:此问题是由用户在数据库中的一个记录上输入2个主图像而创建的。我的业务需求仅表明采取第一个结果。

任何帮助将会很棒!

+1

如何定义'第一' - 查询中没有订单,所以当找到两条记录时,选择'first'的业务规则是什么 - 基于字母顺序?最近更新的日期?随机? (任何解决方案都需要知道规则) – Andrew

+0

这并不重要。此问题由用户在一条记录上输入2张主图像而创建。我的业务需求仅表明采取第一个结果。这是否回答你的问题? –

回答

2

如果可以选择的arbitary这回,我们就可以使用聚合的价值。这然后需要一个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 [email protected] AND gc2a.assettype='Primary Image' 
GROUP BY gpph.id, gpph.cname, gpph.alternateURL 

在这种情况下,使用max(gc2a.assetfilename)是要给你存在多于一个记录的情况下,按字母顺序最高值。这不是理想的选择,知道记录顺序的某种时间标记可能会更有帮助,因为那时“第一”这个词的含义可能更有意义。

+0

好的。我现在知道了。将来,我可以建议一个时间戳和更好的返回结果。感谢您的帮助! –

0

通过更换不同的分组:

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 [email protected] AND gc2a.assettype='Primary Image' 
AND gpph.id = MAX(gpph.id) 
GROUP BY gpph.cname, gc2a.assetfilename, gpph.alternateURL 
+0

感谢您的帮助,但是我在上面的查询中遇到了这个错误:“聚合可能不会出现在WHERE子句中,除非它位于包含在HAVING子句或选择列表中的子查询中,并且聚合的列是外部参考。” –

+0

编辑将SQL放在代码块中,使其更易于阅读 - 但我认为这不对。 where子句中的最大值必须在having子句中成为合法语法,但它仍不能解决问题。 – Andrew

相关问题