将SQL Server动态光标转换为Oracle



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))

最新更新