2012-05-30 6 views
0

Таблица A содержит несколько записей, которые должны быть удалены из таблицы B. Однако в таблице B может быть несколько записей, которые соответствуют одной записи в таблице A. Я хочу удалить только одну совпадающую запись в таблице B для каждой записи в Таблица A. Если в таблице A записано 50 записей, то из таблицы B. следует удалить не более 50 записей. Я использую инструкцию SQL, ниже которой удаляется больше записей из таблицы B, чем указано в таблице A из-за нескольких совпадений , Я не могу далее ограничивать критерии соответствия в своем заявлении из-за ограничений в данных.Как удалить первую соответствующую запись в таблице B для каждой записи в таблице A?

DELETE FROM [#DraftInvoiceRecords] FROM [#DraftInvoiceRecords] 
INNER JOIN [#ReversedRecords] 
ON [#DraftInvoiceRecords].employee = [#ReversedRecords].employee 
    and [#DraftInvoiceRecords].amount = [#ReversedRecords].amount 
    and [#DraftInvoiceRecords].units = [#ReversedRecords].units 
+1

«первый» плохо определен, пока вы не скажете нам, как определить, что порядок. Какой столбец (столбцы) в таблице B следует использовать для определения того, какая строка «первая»? –

ответ

0

Вам нужно каким-то образом отличить строки для удаления из строк для сохранения. Я использовал someOtherColumn в ниже для достижения этой цели:

create table #DraftInvoiceRecords (
    employee int not null, 
    amount int not null, 
    units int not null, 
    someOtherColumn int not null 
) 
create table #ReversedRecords (
    employee int not null, 
    amount int not null, 
    units int not null 
) 
insert into #DraftInvoiceRecords (employee,amount,units,someOtherColumn) 
select 1,1,1,1 union all 
select 1,1,1,2 
insert into #ReversedRecords (employee,amount,units) 
select 1,1,1 
delete from dir 
from 
    #DraftInvoiceRecords dir 
     inner join 
    #ReversedRecords rr 
     on 
      dir.employee = rr.employee and 
      dir.amount = rr.amount and 
      dir.units = rr.units 
     left join 
    #DraftInvoiceRecords dir_anti 
     on 
      dir.employee = dir_anti.employee and 
      dir.amount = dir_anti.amount and 
      dir.units = dir_anti.units and 
      dir.someOtherColumn > dir_anti.someOtherColumn --It's this condition here that allows us to distinguish the rows 
where 
    dir_anti.employee is null 

select * from #DraftInvoiceRecords 

drop table #DraftInvoiceRecords 
drop table #ReversedRecords 
+0

Большое вам спасибо .... Это сработало ... Оцените свою быструю помощь! – papfan

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