使用非唯一值连接2个表 - 将旧版与当前数据进行比较

时间:2016-11-17 20:19:21

标签: sql sql-server

我希望将旧系统中的一些交易数据与当前系统进行比较。这被用作比较的手段。问题是某些交易被多次列出,通常是因为需要在所有相应的报告机构中报告。

所以,让我举一个简单的例子:

当前系统交易数据

Transaction#| ReportCode |
:---------- | ---------: |
 123        | 3          |
 123        | 4          |
 1234       | 3          |
 1235       | 4          |
 1255       | 6          |

旧系统交易数据

Transaction#| ReportCode |
:---------- | ---------: |
 123        | 3          |
 123        | 4          |
 1234       | 6          |
 1235       | 6          |

我正在尝试根据比较两个系统进行以下结果的查询:

Transaction#| ReportCode |
:---------- | ---------: |
 123        | 3          |  Match with Legacy
 123        | 4          |  Match with Legacy
 1234       | 3          |  MisMatch Legacy Reports 6
 1235       | 4          |  Mismatch Legacy Reports 6
 1255       | 6          |  Not in Legacy System

所以我遇到的主要问题是在多个时间表上报告相同的事务。由于它是一个JOIN,它只是抓住它看到的第一个Reportcode,所以我经常会看到这样的结果:

Transaction#| ReportCode |
:---------- | ---------: |
 123        | 3          |  MisMatch Legacy Reports 4
 123        | 4          |  MisMatch Legacy Reports 3

有没有人知道我遇到过这个问题的好方法?以下是我目前的代码

SELECT DISTINCT 
                     a.ReportCode AS LegacyReportCode b.ReportCode AS CurrentReportCode CASE WHEN a.Reportcode= b.ReportCode THEN 'ReportCode Matched' WHEN a.ReportCode IS NULL 
                     THEN 'In Current not in Legacy' WHEN b.ReportCode IS NULL THEN 'In Legacy not in Current' ELSE 'Mismatch' END AS ReportCodeMatchResult, a.TransactionID AS LegacyTransactionID,
                     b.TransactionID AS CurrentTransactionID

FROM                dbo.LegacySystem AS a FULL OUTER JOIN
                     dbo.CurrentSystem AS b ON a.TransactionID = b.TransactionID

2 个答案:

答案 0 :(得分:0)

首先,我会通过在TransactionID和ReportCode上将CurrentSystem连接到LegacySystem来获得所有匹配的。然后,编写单独的查询以获取与

不匹配的查询
Select c.TransactionNum, c.ReportCode, (Select top 1 ReportCode From Legacy Where TransactionNum = c.TransactionNum) as mismatch
From Current c
Where Not Exists
(
    Select 1 From Legacy l
    Where c.TransactionNum = l.TransactionNum and c.ReportCode = l.ReportCode
)

如果在一个结果集中需要它们,可以将它们联合起来。

答案 1 :(得分:0)

class TableOrder { private int? _tablenumber; public int TableNumber { get { return _tablenumber ?? (_tablenumber=GetTableNumberFromInput()); } set { _tablenumber = value; } } private static int GetTableNumberFromInput() { Console.Write("please enter the table number:"); string inputtablenumber = Console.ReadLine(); return int.Parse(inputtablenumber); } //(and so on for other member properties) } 几乎是正确的方法。但是,您无法真正指定不匹配的FULL OUTER JOIN

但是,您可以在ReportCode条件中加入ReportCode来获取所需信息:

ON