2016-09-30 59 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 timestamp類型
1 2016年8月9日的新
1 2016年8月9日更新
1 08/15/2016新
1 08/15/2016更新

回答

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子句。
  • 只要對舊式外連接語法說不,即使Oracle不贊成使用。使用顯式外連接。
  • Oracle支持date關鍵字,因此您可以使用ISO標準格式輸入日期。
+0

你知道有些時候老甲骨文語法連接無法避免......例如REFRESH實施FAST物化視圖中的錯誤阻止如果創建視圖的查詢包含ANSI快速提神連接。自從我學到這些,我說「在大多數情況下」而不是「永遠」。 :-) – mathguy

0

你做一個外連接,所以你會得到兩行(所有的id都是1)。在第二個中,t2.update_time是NULL。

您的查詢,您編寫它的方式,首先測試t1.create_time爲非null。外連接中的兩行都是如此。所以只有第一個「當......那麼」被評估過。

請解釋您所需輸出的邏輯;只是顯示它,並顯示不符合您要求的查詢,並不構成您的要求的「完整規範」。

編輯:對此答覆的評論中的OP聲明瞭他需要獲得的是create_time以及所有非null的update_time值。

這很簡單,不需要連接,它需要一個UNION(或UNION ALL)。在示例數據中,所有行都具有相同的ID;如果在現實生活中有更多的ID,可以用WHERE子句選擇一個。

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 - 如果需要的話)

OP:如果這不是想要的結果,請解釋它是如何從你需要什麼樣的不同。

編輯號碼2:OP添加到需求 - 還需要一個類型標記。

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

嘿 - 誰低估了答案,我不在乎評分或聲譽,但至少爲了別人的利益,你可以解釋答案的錯誤。否則,我們都在猜測。 – mathguy

+0

我並不低調,但我懷疑這是因爲你的回答在這種情況下有點神祕,你向OP發表了評論。所以也許有人把它當作評論而不是答案?無論如何,注意並提及主要問題的+1是因爲兩種情況下的create_time都不爲空,並且首先進行測試,這就是OP可能會得到該結果的原因。戈登給出了一個很好的答案,但錯過了特別提到你的回答和OP特別提到的病例順序邏輯。通常情況下,我希望在你的回答中更清楚,儘管 – Matt

+0

@Matt - 我的第一段是爲了解釋最高級別查詢中發生的事情。有一個連接(使用Oracle棄用語法的外連接),但由於兩個表中都存在相同的ID,所以連接實際上與內連接相同。你會得到輸出中的所有兩行。然後,在第二段中,我回答了OP的問題,他想知道什麼是錯的。第三,我說我不知道​​他*的意思*做什麼;如果他想要修復查詢,我需要知道它應該做什麼。我討厭按要求猜測(正如你可能知道的那樣) – mathguy