i有一个表,其中包含两个不同表中行之间匹配的结果。在表A中,通过列Export_Invoice_ID唯一标识行,表B记录在列import_invoice_id中唯一识别。除这些标识列外,表都具有一组包含发票标头数据的列。我需要匹配这两个表的行
有一个作业可以在表A和B中进行槽记录,并根据表A中的任何一排数据匹配表B中的任何一行数据,从而创建了匹配分数。结果存储在表匹配中。该表包含来自表B的表A,import_invoice_id的export_invoice_id,并指示记录相等的match_score。Match_score越高 - 两个表中的记录越相等。
匹配表中的数据样本表:
IMPORT_INVOICE_ID EXPORT_INVOICE_ID MATCH_SCORE SORT_ID 0 5117095 17 1 0 5117096 9 2 0 5117097 9 3 1 5117096 17 4 1 5117097 17 5 1 5117095 9 6 2 5117097 17 7 2 5117096 10 8 2 5117095 9 9
列sort_id给出排序顺序(按import_invoice_id进行排序,match_score desc,export_invoice_id(
我想从此匹配表中删除行,以便我只剩下表A中的Export_Invoice ID的最佳匹配,而import_invoice_id在表b中。每个import_invoice_id and export_invoice_id值只能使用一次。
IMPORT_INVOICE_ID EXPORT_INVOICE_ID MATCH_SCORE SORT_ID 0 5117095 17 1 1 5117096 17 4 2 5117097 17 7
要在SQL Server中执行此操作,我有以下可以执行我想要的光标(请注意光标动态(:
DECLARE @ExportInvoiceId AS int;
DECLARE @ImportInvoiceID AS int;
DECLARE @SortId AS bigint;
DECLARE Match_Cursor CURSOR DYNAMIC TYPE_WARNING FOR
SELECT export_invoice_id, import_invoice_id, sort_id FROM matches ORDER BY sort_id
OPEN Match_Cursor
FETCH NEXT FROM Match_Cursor INTO @ExportInvoiceId, @ImportInvoiceID, @SortId;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM matches WHERE sort_id > @SortId AND(export_invoice_id = @ExportInvoiceId OR import_invoice_id = @ImportInvoiceId)
FETCH NEXT FROM Match_Cursor INTO @ExportInvoiceId, @ImportInvoiceID, @SortId;
END;
CLOSE Match_Cursor;
DEALLOCATE Match_Cursor;
如何在Oracle中完成?
圣牛比我想象的要困难
问题是,Oracle的确读取一致性与SQL Server的读取性不同
很难在光标中执行此操作,因为如果您打开光标,则不会刷新结果集,除非您在删除后重新打开
所以 - 尝试一下,它只是一个直接的删除,没有光标
delete
from matches a
where (a.match_score,a.sort_id) not in (select max(b.match_score), min(sort_id)
from matches b
where (a.import_invoice_id=b.import_invoice_id
or a.export_invoice_id=b.import_invoice_id))