2016-09-30 2 views
0

내 사례가 틀린 것 같고 잘못된 점을 파악할 수 없습니다. 그것은 나에게 시간과 갱신 시간 기록을 만드는데 같은 날을 준다. 여기 내 데이터가 모습입니다 :사례 날짜가있는 명세서 언제

T1 :

ID  create_time 
1  08/09/2016 07:30:20AM 

T2 :

ID update_time 
1  
1 08/15/2016 09:41:46AM 

나는 다음과 같은 기대하고있다 : 생성에 대한

ID TimeStamp 
1 08/09/2016 07:30:20AM 
1 08/15/2016 09:41:46AM 

그러나 내 코드가 반환 값을 2 레코드에 대한 시간. 그것은 다음과 같습니다 : 나는 또한 별도의 열에서 새로운/업데이트로/업데이트를 만들 시간을 기준으로 각 레코드를 표시해야

ID TimeStamp 
1 08/09/2016 07:30:20AM 
1 08/09/2016 07:30:20AM 

select t1.id, t1.desc, 
Case 
WHEN t1.create_time IS NOT NULL 
THEN t1.create_time 
WHEN t2.update_time IS NOT NULL 
THEN t2.update_time 
END AS "TimeStamp" 
from t1, t2 
where t1.id=t2.id 
AND (t1.create_time BETWEEN TO_DATE ('01-AUG-2016 00:00:00', 
           'dd-mon-yyyy HH24:Mi:SS') 
       AND TO_DATE ('31-AUG-2016 23:59:59', 
          'dd-mon-yyyy HH24:Mi:SS') 
    OR ( t2.update_time 
       BETWEEN TO_DATE ('01-AUG-2016 00:00:00', 
           'dd-mon-yyyy HH24:Mi:SS') 
       AND TO_DATE ('31-AUG-2016 23:59:59', 
          'dd-mon-yyyy HH24:Mi:SS') 
      ) 
     ) 

. 그러나이 보인다

CASE 
WHEN (t1.create_time IS NOT NULL AND t2.update_time IS NULL) 
THEN 'New' 
WHEN t2.update_time IS NOT NULL 
THEN 'Update' 
END AS "Type" 

다음과 같이 중복을 가져 될 :
ID의 타임 스탬프 형식
1 2016년 8월 9일 새로운
1 2016년 8월 9일 업데이트 나는 다음과 같이 사용하여이 사건을하고 있었다
1 2016년 8월 15일 새로운
1 2016년 8월 15일 업데이트

답변

1

이 당신이 원하는 일을합니까?

select t1.id, t1.desc, 
     coalesce(t2.update_time, t1.create_time) as "TimeStamp" 
from t1 left join 
    t2 
    on t1.id = t2.id and 
     t2.update_time >= date '2016-08-25' and 
     t2.update_time < date '2016-09-01' 
where (t1.create_time >= date '2016-08-25' and 
     t1.create_time < date '2016-09-01' 
    ) or 
     t2.update_time is not null; 

편집 : 당신은 업데이트의 목록을 원하는 업데이 트를가하거나 지정된 기간 동안 만든 모든 레코드에 대한 시간을 만들 것

. 나는이의 모습을 생각 :

with ids as (
     select t1.id, t1.desc, t1.create_time 
     from t1 join 
      t2 
      on t1.id = t2.id 
     where (t1.create_time >= date '2016-08-25' and 
      t1.create_time < date '2016-09-01' 
      ) t or 
      (t2.update_time >= date '2016-08-25' and 
      t2.update_time < date '2016-09-01' 
      ) 
    ) 
select ids.* 
from ids 
union all 
select ids.id, ids.desc, t2.update_time 
from ids join 
    t2 
    on t2.id = ids.id 
where t2.update_time is not null; -- I'm not sure if the range should also be checked here. 

주 : FROM 절에

  • 결코 사용 쉼표를. 항상JOINON 절을 명시 적으로 사용하십시오.
  • 오라클이 더 이상 사용하지 않는 구식 외부 조인 구문에는 no 라고만 말하십시오. 명시 적 외부 조인 사용.
  • 오라클은 date 키워드를 지원하므로 ISO 표준 형식을 사용하여 날짜를 입력 할 수 있습니다.
+0

조인. 내가 이것을 배웠기 때문에 나는 항상 "항상"보다는 "대부분의 경우에"말한다. :-) – mathguy

0

외부 조인을하면 두 개의 행이 생성됩니다 (모든 ID는 1입니다). 두 번째 t2.update_time은 NULL입니다.

귀하가 작성한 방식대로, 먼저 t1.create_time이 널이 아닌지 테스트합니다. 이것은 외부 조인의 두 행 모두에 해당됩니다. 그래서 처음의 "언제 ... 그"만이 평가됩니다.

원하는 출력의 논리를 설명하십시오. 그냥 표시하고 원하는 것을 수행하지 않는 쿼리를 표시하는 것은 요구 사항의 "완전한 사양"을 구성하지 않습니다.

EDIT :이 답변에 대한 설명에서 OP를 통해 필요한 것은 모두 null이 아닌 update_time 값과 함께 create_time입니다.

이것은 쉽고 가입이 필요하지 않으므로 UNION (또는 UNION ALL)이 필요합니다. 샘플 데이터에서 모든 행은 동일한 ID를가집니다. 실생활에서 ID가 더 많은 경우 WHERE 절을 사용하여 ID를 선택할 수 있습니다.

select id, create_time as timestamp from t1 
union all 
select id, update_time from t2 where update_time is not null; 

(아마도 ORDER BY id, timestamp를 추가 - 필요한 경우)

영업 이익이 원하는 결과가 아닌 경우, 당신이 필요한 것과 다른 방법을 설명하시기 바랍니다.

편집 번호 2 : OP가 요구 사항에 추가되었습니다. 유형 마커도 있어야합니다. 당신은 오래된 오라클 구문 예를 들어 ... 피할 수없는 조인을 위해 FAST 구체화 된 뷰에 대한 REFRESH의 구현에 버그가 뷰를 만들 수있는 쿼리가 ANSI가 포함되어있는 경우 빠른 상쾌을 방지 할 때 경우가 알고

select id, create_time as timestamp , 'New' as type from t1 
union all 
select id, update_time, 'Update' from t2 where update_time is not null; 
+0

안녕하세요 - 누구든지 대답을 downvotes, 나는 평점이나 평판에 대한 상관 없어,하지만 적어도 다른 사람의 이익을 위해, 당신은 대답이 잘못된 무엇인지 설명 할 수 있습니다. 그렇지 않으면 우리 모두 왼쪽 추측입니다. – mathguy

+0

나는 downvote 아니었지만 당신의 대답은이 경우 약간의 암호가 있었고 당신은 OP에 댓글을 달았 기 때문에 그것이 의심됩니다. 어쩌면 누군가가 그 대답을 주석이 아니라고 착각했을 것입니다. 어쨌든 주목할만한 점은 +1은 create_time이 두 경우 모두 null이 아니며 OP가 그 결과를 얻게 될 가능성이있는 이유입니다. Gordon은 좋은 답변을 주었지만 답변 및 OP에서 구체적으로 언급 한 사례 순서 논리를 구체적으로 언급하지 않았습니다. 일반적으로 나는 그것이 당신의 대답에서 더 명확 해지기를 기대할 것입니다. – Matt

+0

@Matt - 나의 첫 단락은 가장 높은 단계에서 어떤 일이 일어 났는지를 설명하기위한 것입니다. 조인 (Oracle deprecated 구문을 사용하는 외부 조인)이 있지만 동일한 ID가 두 테이블에 모두 있으므로 조인은 사실 내부 조인과 동일합니다. 출력에서 두 행을 모두 얻습니다. 그런 다음 두 번째 단락에서 OP의 질문에 답했습니다. 누가 잘못되었는지 알고 싶었습니다. 셋째로 나는 그가해야할 일이 무엇인지 모른다. 그가 쿼리 수정에 도움을 원한다면, 나는 그것이 무엇을해야 하는지를 알 필요가있었습니다. 나는 당신이 아는 것처럼 요구 사항을 추측하는 것을 싫어한다. – mathguy