2016-09-30 4 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') 
      ) 
     ) 

Также нужно отметить каждую запись на основе создания/обновления времени, как New/Update в отдельной колонке. Я делал это, используя случай, когда, как показано ниже:

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 08/09/2016 Новый
1 08/09/2016 Update
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; 

EDIT:

Вы, кажется, хотите получить список обновлений и создать раз для любой записи, которая имеет обновление или создать в течение определенного периода времени. Я думаю, что это выглядит следующим образом:

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. JOIN с предложением ON.
  • Просто скажите «нет» архаичному внешнему синтаксису соединения, что даже Oracle не одобряет. Использование явных внешних соединений.
  • Oracle поддерживает ключевое слово date, поэтому вы можете вводить даты с использованием стандартных форматов ISO.
+0

Вы знаете, есть случаи, когда старый синтаксис Oracle для объединений не может быть предотвращено ... например, ошибка в реализации ОБНОВИТЬ БЫСТРО для материализованных представлений позволяет быстро освежать, если запрос, чтобы создать представление содержит ANSI присоединяется. Поскольку я узнал об этом, я говорю «в большинстве случаев», а не «всегда». :-) – mathguy

0

Вы выполняете внешнее соединение, поэтому вы получите две строки (все идентификаторы - 1). Во втором случае t2.update_time равно NULL.

Ваш запрос, как вы его написали, первые тесты для t1.create_time должны быть не пустыми. Это верно для BOTH строк во внешнем соединении. Так что только ПЕРВЫЙ «КОГДА ... ТОГДА» всегда оценивается.

Пожалуйста, объясните логику желаемого результата; просто показывая его и показывая запрос, который НЕ делает то, что вы хотите, не является «полной спецификацией» вашего требования.

EDIT: ОП в комментарии к этому ответу заявил, что ему нужно получить, это create_time вместе со всеми ненулевыми значениями update_time.

Это легко и не требует объединения, для этого требуется UNION (или UNION ALL). В образце данных все строки имеют одинаковый идентификатор; если в реальной жизни есть больше идентификаторов, можно выбрать предложение 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, скорее всего, получит этот результат. Гордон дал хороший ответ, но пропустил конкретно упоминание логики порядка дел, о которой конкретно упоминают ваш ответ и ОП. Обычно я ожидал, что это будет более ясным в ответе от вас, хотя – Matt

+0

@Matt - мой первый параграф должен был объяснить, что происходит в запросе на самом высоком уровне. Существует соединение (внешнее соединение с использованием устаревшего синтаксиса Oracle), но поскольку тот же идентификатор существует в обеих таблицах, соединение фактически совпадает с внутренним соединением. Вы получаете все две строки на выходе. Затем во втором абзаце я ответил на вопрос ОП, который хотел знать, что случилось. В третьем я сказал, что не знаю, что он * хотел сделать; если ему нужна помощь в исправлении запроса, мне нужно было знать, что он должен был делать в первую очередь. Мне не нравится угадывать требования (как вы, возможно, знаете) – mathguy

Смежные вопросы