2012-01-20 2 views
0

ReleaseHistory 및 IterationHistory 테이블에 ReleaseID 및 IterationID 당 여러 레코드가 있으므로이 쿼리에서 중복 결과가 있음을 알고 있습니다. dbo.ReleaseHistory 및 dbo.IterationHistory에서 최대 날짜가있는 레코드 만 선택하고 싶습니다. 이 쿼리에서 어떻게합니까? SQL 서버 2008최대 날짜를 찾아 중복 결과를 제거하려면 어떻게합니까?

SELECT  dbo.Assignable.AssignableID AS ID, 
      dbo.EntityType.Abbreviation AS Entity, 
      dbo.General.Name, dbo.Assignable.Effort, 
      dbo.Assignable.EffortCompleted, 
      dbo.Assignable.EffortToDo, 
      dbo.EntityState.Name AS State, 
      dbo.ReleaseHistory.Name AS Release, 
      dbo.IterationHistory.Name AS Iteration, 
      dbo.General.CustomField3 AS [Scrum Team] 
FROM  dbo.Assignable INNER JOIN 
      dbo.General ON dbo.Assignable.AssignableID = 
      dbo.General.GeneralID INNER JOIN 
      dbo.EntityType ON dbo.General.EntityTypeID = 
      dbo.EntityType.EntityTypeID INNER JOIN 
      dbo.EntityState ON dbo.Assignable.EntityStateID = 
      dbo.EntityState.EntityStateID AND 
      dbo.EntityType.EntityTypeID = 
      dbo.EntityState.EntityTypeID INNER JOIN 
      dbo.ReleaseHistory ON dbo.Assignable.ReleaseID = 
      dbo.ReleaseHistory.ReleaseID INNER JOIN 
      dbo.IterationHistory ON 
      dbo.Assignable.IterationID = 
      dbo.IterationHistory.IterationID LEFT OUTER JOIN 
      dbo.CustomField ON dbo.General.CustomField3 = 
      dbo.CustomField.CustomFieldID 
WHERE  (dbo.Assignable.ProjectID = 4054) 
GROUP BY dbo.Assignable.AssignableID, 
      dbo.EntityType.Abbreviation, 
      dbo.General.Name, 
      dbo.Assignable.Effort, 
      dbo.Assignable.EffortCompleted, 
      dbo.Assignable.EffortToDo, 
      dbo.EntityState.Name, 
      dbo.ReleaseHistory.Name, 
      dbo.IterationHistory.Name, 
      dbo.General.CustomField3 
+1

어떤 데이터베이스 플랫폼 및 버전 (MySQL, SQL Server 등)을 사용하고 있습니까? –

+0

SQL Server 2008 – Brian

답변

1

브라이언, 난 당신이 MS SQL에서이 일을하고 항상 ReleaseHistory 및 IterationHistory 테이블에서 적어도 하나 개의 레코드가있을 것입니다 즐겁게하고

. 가정이 정확하다면 CROSS APPLY를 사용하여 두 테이블 모두에서 상위 1 레코드를 얻을 수 있습니다.

SELECT 
    dbo.Assignable.AssignableID AS ID , 
    dbo.EntityType.Abbreviation AS Entity , 
    dbo.General.Name , 
    dbo.Assignable.Effort , 
    dbo.Assignable.EffortCompleted , 
    dbo.Assignable.EffortToDo , 
    dbo.EntityState.Name AS State , 
    Release , 
    Iteration , 
    dbo.General.CustomField3 AS [Scrum Team] 
FROM 
    dbo.Assignable 

    INNER JOIN dbo.General ON dbo.Assignable.AssignableID = dbo.General.GeneralID 
    INNER JOIN dbo.EntityType ON dbo.General.EntityTypeID = dbo.EntityType.EntityTypeID 
    INNER JOIN dbo.EntityState ON dbo.Assignable.EntityStateID = dbo.EntityState.EntityStateID 
     AND dbo.EntityType.EntityTypeID = dbo.EntityState.EntityTypeID 
    CROSS APPLY(SELECT TOP 1 name Release FROM ReleaseHistory WHERE ReleaseID = Assignable.ReleaseID ORDER BY MaxDateColumn) a 
    CROSS APPLY(SELECT TOP 1 name Iteration FROM IterationHistory WHERE IterationID = Assignable.IterationID ORDER BY MaxDateColumn) b 
    LEFT OUTER JOIN dbo.CustomField ON dbo.General.CustomField3 = dbo.CustomField.CustomFieldID 
WHERE 
    (dbo.Assignable.ProjectID = 4054) 
GROUP BY 
    dbo.Assignable.AssignableID , 
    dbo.EntityType.Abbreviation , 
    dbo.General.Name , 
    dbo.Assignable.Effort , 
    dbo.Assignable.EffortCompleted , 
    dbo.Assignable.EffortToDo , 
    dbo.EntityState.Name , 
    dbo.ReleaseHistory.Name , 
    dbo.IterationHistory.Name , 
    dbo.General.CustomField3 
+0

쿼리를 사용하여 'CROSS'키워드 근처에서 구문이 잘못되었습니다. – Brian

+0

크로스 적용하려면 별칭이 필요합니다. 내 환경에서만 실행할 수 없기 때문에 "불법 코딩/테스트 시리니 !!!!"라고 말할 수 있습니다. – Shrini

+0

대체해야 할 부품은 무엇입니까? CROSS APPLY (SELECT TOP 1 name Release ReleaseHD ReleaseID = Assignable.ReleaseID ORDER BY MaxDateColumn) a – Brian

관련 문제