объединить почти одинаковые записи в sql - PullRequest
2 голосов
/ 20 января 2012

Приветствую всех ...

У меня две таблицы, и их структура идентична ...

Таблица logDetail

Date              Time         CardID        Status  
2012-01-20        00:00:00     A1            ABSENT
2012-01-20        00:00:00     B1            ABSENT
2012-01-20        00:00:00     C3            ABSENT
2012-01-20        00:00:00     D1            ABSENT

Таблица preStatus

Date            Time        CardID        Status
2012-01-20     07:00:10     A1            COMING
2012-01-20     07:10:00     C3            COMING
2012-01-20     08:00:00     B1            LATE
2012-01-20     17:00:00     B1            BACK
2012-01-20     17:10:10     A1            BACK
2012-01-20     17:13:00     C3            BACK

После слияния

Date
2012-01-20     07:00:10     A1            COMING
2012-01-20     07:10:00     C3            COMING
2012-01-20     08:00:00     B1            LATE
2012-01-20     00:00:00     D1            ABSENT
2012-01-20     17:00:00     B1            BACK
2012-01-20     17:10:10     A1            BACK
2012-01-20     17:13:00     C3            BACK

Как я могу объединить эти две таблицы, потому что в таблице b есть повторяющиеся записи и когда я делаю слияние ...

merge into logDetail as Target 
using preStatus as Source
on Target.L_Date=Source.L_Date
and Target.L_Time='00:00:00'
and Target.L_CardID=Source.L_CardID 
when matched then

update set Target.L_Status=Source.L_Status,
Target.L_Time=Source.L_Time
when not matched then
insert (L_Date,L_Time,L_CardID,L_Status) 
                           values(Source.L_Date,Source.L_Time,Source.L_CardID,Source.L_Status);

сказаноОператор MERGE пытался ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 20 января 2012

Вы не хотите объединять таблицы, так как CardID не является первичным ключом.

Похоже, что вы хотите сохранить записи, где Status = "COMING", даже когда есть новые записигде stats = "BACK".

Я предлагаю вам сделать это в два шага, сначала выполнить вставку данных preStatus, затем удалить строки "ABSENT" там, где есть строки "COMING" и "BACK".

/* Insert new data */
insert logDetail
select * from preStatus

/* Delete Absent rows where there is a COMING or BACK row for the same item on the same day */
Delete logDetail
from logDetail ld1
where 
    /* Absent rows only */
    ld1.time = '00:00:00'
and ld1.Status = 'ABSENT'
/*  And there must be a COMING or BACK row for the same card on the same day */
and exists (
   select 1 from logDetail ld2
   where ld2.Date = ld1.Date
   and ld2.CardID = ld1.CardID
   and ld2.Time > '00:00:00'
   and ld2.Status <> 'ABSENT'
)

Чтобы удалить строки с той же датой, CardID и тем же статусом, но там, где есть более позднее время:

Delete logDetail
from logDetail ld1
where 
ld1.status in ('COMING', 'BACK')
/*  COMING or BACK row only */ 
      /* for the same card on the same day, with a later time*/
and exists (
   select 1 from logDetail ld2
   where ld2.Date = ld1.Date      
   and ld2.CardID = ld1.CardID
   and ld2.Status = ld1.Status
   and ld2.Time > ld1.Time
)
0 голосов
/ 20 января 2012

Ничего не делать при совпадении, это должно решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...