2017-04-07 4 views
1

두 개의 테이블 (저널 및 인시던트)이 있습니다. 각 사건에는 둘 이상의 업무 일지 항목이있을 수 있습니다. 기록과 최근 저널 데이터를 선택하고 싶습니다.최근 레코드 선택

맨 아래 부분은 내가보고 싶은 사건을 필터링하는 부분입니다. 그 중 가장 최근의 분개와 관련된 분개 값을 원합니다.

이 코드는 내가 여기에서 발견 한 코드이지만, 실행할 때 쿼리 설정이 'DataSet1'에 실패했습니다. 불행히도 로그 파일에 액세스 할 수있는 권한이 없습니다. 단서가있다

이 어떤 도움에 감사드립니다

내가 잘못 중첩 할 수 있습니다 생각

SELECT 
b.IncidentNumber 
,a.Subject 
,a.CreatedDateTime 
,b.SubCategory 
,b.EffectiveDueDate 
,b.NextActionDate 
,b.ProfileFullName 

FROM 
(
SELECT 
    b.IncidentNumber 
,a.Subject 
,a.CreatedDateTime 
,rn = row_number() OVER (PARTITION by b.IncidentNumber ORDER BY 
    a.CreatedDateTime DESC) 
,b.SubCategory 
,b.EffectiveDate 
,b.NextActionDate 
,b.ProfileFullName 


FROM 
Journal a LEFT JOIN Incident b ON 
a.ParentRecordNumber = b.IncidentNumber 

WHERE a.Category LIKE '%KANBAN%' 
AND (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
AND b.SubCategory <> 'User Termination' 
AND b.SubCategory <> 'Res Temp Termination' 
AND a.Subject LIKE 'UP |%' 
) X 
WHERE rn = 1 
+0

SSMS에서 쿼리를 실행하고 어떤 오류가 발생하는지 확인하십시오. –

+1

상단 선택에서 b 또는 a 만 사용하지 않습니다. – xQbert

답변

1

몇 가지 :...

  • 외부 대부분의 값이 별칭 인라인 뷰에서해야 선택 " X "아니오. r b. 이러한 별칭은 내부 쿼리의 범위에 불과하기 때문입니다. (coorlation을 사용할 때를 제외하고는 1 레벨 밖에 믿을 수 없다)
  • 왼쪽 대신에 right join이 필요하거나 테이블의 순서를 바꿀 필요가있다. 나는 모든 사건과 가장 최근의 저널을 원한다고 생각합니다. 모든 저널 및 관련된 사건이 ​​존재하지 않는 한. 그래서 나는 순서를 바꿨다.
  • 마지막으로 외부 조인을 사용할 때 외부 조인의 모든 레코드 테이블에만 제한을 설정할 수 있습니다. WHERE 절 조건에 따라 OUTER 조인 된 테이블은 외부 조인에 의해 생성 된 Null 레코드를 제외시킵니다. 이 문제를 해결하려면 제한 조건을 조인으로 이동하거나 '또는'문을 사용하여 null을 확인해야합니다 (조인으로 이동하는 것이 더 깔끔합니다). 합류가 발생하기 전에 제한을 적용하고 있다고 생각하여 사건의 Null 레코드가 유지됩니다. 그렇지 않은 경우 외부 조인은 두 테이블에없는 레코드 (또는이 경우에는 저널에없는 레코드)를 제외하여 내부 조인을 시뮬레이트합니다.

.

SELECT x.IncidentNumber --alias x not a/b as the from is aliased as 'X' 
    , x.Subject 
    , x.CreatedDateTime 
    , x.SubCategory 
    , x.EffectiveDueDate 
    , x.NextActionDate 
    , x.ProfileFullName 
FROM (SELECT b.IncidentNumber 
      , a.Subject 
      , a.CreatedDateTime 
      , rn = row_number() OVER (PARTITION by b.IncidentNumber 
            ORDER BY a.CreatedDateTime DESC) 
      , b.SubCategory 
      , b.EffectiveDate 
      , b.NextActionDate 
      , b.ProfileFullName 
     FROM Incident b --switched the order I think you want all incidents and if a journal exists it's value. 
     LEFT JOIN Journal a 
     ON a.ParentRecordNumber = b.IncidentNumber 
     -- Since A is on the if match found to B, we need to move this to the join or we lose the records created from the outer join. 
     AND a.Category LIKE '%KANBAN%' 
     AND a.Subject LIKE 'UP |%' 
     --moved some where clause criteria to the join Since B is on the "all records side" of the outer join we can leave B in the where clause. 
     WHERE (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
      AND b.SubCategory <> 'User Termination' 
      AND b.SubCategory <> 'Res Temp Termination') X 
WHERE rn = 1 

여기에서 레코드를 받고 있지 않은 경우, 나는이 원하는대로 쿼리가 작동되어 있는지 확인하고 찾을 수없는 기록을 일으키지 않는 무엇을 볼 수 제한을 다시 추가 할 수 제한 기준의 일부를 제거하기 시작 했죠 .

+0

훌륭해, 나는 이것을 시험해보고 어떻게되는지 알려줄거야. –

0

이 보고서는 마침내 예상대로 작동합니다. 질의가 작동하려면 몇 차례 반복해야했지만 지금해야 할 일을하고 있습니다. 많은 도움을 주셔서 감사합니다. 나는 결코 그것없이 거기에 도착하지 않고 있었을 것이다!

SELECT x.IncidentNumber 
, x.Subject 
, x.CreatedDateTime 
, x.SubCategory 
, x.ProfileFullName 
, x.PropertyNumber 
, x.Status 
, x.EffectiveDueDate 

FROM (SELECT b.IncidentNumber 
     , a.Subject 
     , a.CreatedDateTime 
     , rn = row_number() OVER (PARTITION by b.IncidentNumber 
           ORDER BY a.CreatedDateTime DESC) 
     , b.SubCategory 
     , b.ProfileFullName 
     , b.PropertyNumber 
    , b.Status 
     , b.EffectiveDueDate 

    FROM Incident b 
    RIGHT JOIN Journal a 
     ON a.ParentRecordNumber = b.IncidentNumber 

     AND a.Category LIKE '%KANBAN%' 
     AND a.Subject LIKE 'UP |%'  
     WHERE (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
    ) x 

WHERE rn = 1