从多行列创建单个列值

时间:2013-09-20 12:14:17

标签: sql sql-server dynamic-sql

我面临着dynamic sql query的一个非常孤立的问题。我在一个stored procedure上运行了两个查询。他们正在关注

首先查询:

SELECT *
                FROM (
                      SELECT  ROW_NUMBER() OVER(ORDER BY viwPerformance.LastModifiedOn DESC) AS rowNumber,viwPerformance.* FROM viwPerformance WHERE OrgId=218 AND EmployeeId = 1668 AND IsTerminate = 0 AND TagId LIKE '%' + CAST(2893 AS VARCHAR) + '%' AND Archive='False' AND SmartGoalId IS NOT NULL
                     ) AS E
                WHERE  rowNumber >= 1 AND
                       rowNumber <  11

它会导致所有列值和SmartGoalId

4471,2815,4751,4733,4863,4690,4691,4692,4693,4694

第二个查询(这里我只需要上面的查询中的SmartgoalId,所以我使用的东西)

SELECT @strGoalIds = STUFF((SELECT ',' + CAST(SmartGoalId AS VARCHAR)
                FROM (
                      SELECT  ROW_NUMBER() OVER(ORDER BY viwPerformance.LastModifiedOn DESC) AS rowNumber,viwPerformance.* FROM viwPerformance WHERE OrgId=218 AND EmployeeId = 1668 AND IsTerminate = 0 AND TagId LIKE '%' + CAST(2893 AS VARCHAR) + '%' AND Archive='False' AND SmartGoalId IS NOT NULL
                     ) AS E
                 WHERE  rowNumber >= 1 AND
                       rowNumber <  11 FOR XML PATH('')), 1, 1, '')

它的结果是SmartgoalId为

4471,2815,4751,4733,4863,4651,4690,4691,4692,4693

请注意,上面的查询无法提供最后一个ID“4694”,因为添加了“4651”,但第一次查询无法使用,这是正确的,“4651”不应该出现在第二个查询结果中

所以我的主要观点是为什么第二个查询给出不同的结果,因为它与第一个查询相同。

注意:我是正确的Stuff函数可以反转值而不是按正确顺序给出它们。

1 个答案:

答案 0 :(得分:3)

因为LastModifiedOn的某些行具有相同的值,所以它取决于您希望如何处理关系。

如果您希望此查询始终返回10个“最近”行,但在有关联时始终返回相同的行,则可以在ORDER BY viwPerformance.LastModifiedOn DESC子句中添加另一列,这将使排序唯一且不变,像:

ORDER BY viwPerformance.LastModifiedOn,viwPerformance.SmartGoalId DESC)
相关问题