Sql server 比较两个表之间的数据,每个表中有多条相同的记录
情况是这样的。。。我在表之间没有唯一的标识符来进行匹配,所以我匹配的值可以在两个表中出现多次。我觉得我必须分配一些值,然后在下一条记录尝试匹配时,将该记录从可用于匹配的位置删除 表1包含以下数据:Sql server 比较两个表之间的数据,每个表中有多条相同的记录,sql-server,Sql Server,情况是这样的。。。我在表之间没有唯一的标识符来进行匹配,所以我匹配的值可以在两个表中出现多次。我觉得我必须分配一些值,然后在下一条记录尝试匹配时,将该记录从可用于匹配的位置删除 表1包含以下数据: MedicationName ID Pt Price SEQ Drug1 123 AAA 100.00 1 Drug2 345 AAA 200.00 2 Table 2 InjectionName ID PT St
MedicationName ID Pt Price SEQ
Drug1 123 AAA 100.00 1
Drug2 345 AAA 200.00 2
Table 2
InjectionName ID PT StarDate EndDate
Drug1 123 AAA 20170101 20991231
Drug1 123 AAA 20160417 NULL
Drug2 345 AAA 20161101 20191231
结果应该是:
Medication MedID Price Injection InjID StartDate EndDate PT Seq
Drug1 123 100.00 Drug1 123 20170101 20991231 AAA 1
*NULL NULL NULL Drug1 123 20160417 NULL AAA NULL*
Drug2 345 200.00 Drug2 345 20161101 20191231 AAA 2
但我的结果是:
Medication MedID Price Injection InjID StartDate EndDate PT Seq
Drug1 123 100.00 Drug1 123 20170101 20991231 AAA 1
*Drug1 123 100.00 Drug1 123 20160417 NULL AAA 1*
Drug2 345 200.00 Drug2 345 20161101 20191231 AAA 2
我需要证明第二个表中的第二个项目在表1中没有匹配值,因为第1个项目已经与之匹配。您需要行号来分隔行。。试试这个:
With Table1 As
(
Select 'Drug1' MedicationName , 123 ID ,'AAA' Pt ,100.00 Price,1 SEQ
Union Select 'Drug2' MedicationName , 345 ID ,'AAA' Pt ,100.00 Price,1 SEQ
),
Table2 As
(
Select 'Drug1' InjectionName, 123 ID, 'AAA' PT, 20170101 StarDate, 20991231 EndDate
Union Select 'Drug1' InjectionName, 123, 'AAA', 20160417, NULL
Union Select 'Drug2' InjectionName, 345, 'AAA', 20161101, 20191231
),
Table1_Id As
(
Select
Cast (Row_Number() Over (Partition By MedicationName, ID Order BY MedicationName, Id) as Int) MedicationNumber,
MedicationName, Id, PT, Price, Seq
From Table1
),
Table2_Id As
(
Select
Cast (Row_Number() Over (Partition By InjectionName, ID Order BY InjectionName, Id) as Int) InjectionNumber,
InjectionName, Id, PT, StarDate, EndDate
From Table2
)
Select *
From Table1_Id T1
Full Outer Join Table2_Id T2
On T1.MedicationName = T2.InjectionName
And T1.ID = T2.ID
And T1.MedicationNumber = T2.InjectionNumber
您需要行号来分隔行。。试试这个:
With Table1 As
(
Select 'Drug1' MedicationName , 123 ID ,'AAA' Pt ,100.00 Price,1 SEQ
Union Select 'Drug2' MedicationName , 345 ID ,'AAA' Pt ,100.00 Price,1 SEQ
),
Table2 As
(
Select 'Drug1' InjectionName, 123 ID, 'AAA' PT, 20170101 StarDate, 20991231 EndDate
Union Select 'Drug1' InjectionName, 123, 'AAA', 20160417, NULL
Union Select 'Drug2' InjectionName, 345, 'AAA', 20161101, 20191231
),
Table1_Id As
(
Select
Cast (Row_Number() Over (Partition By MedicationName, ID Order BY MedicationName, Id) as Int) MedicationNumber,
MedicationName, Id, PT, Price, Seq
From Table1
),
Table2_Id As
(
Select
Cast (Row_Number() Over (Partition By InjectionName, ID Order BY InjectionName, Id) as Int) InjectionNumber,
InjectionName, Id, PT, StarDate, EndDate
From Table2
)
Select *
From Table1_Id T1
Full Outer Join Table2_Id T2
On T1.MedicationName = T2.InjectionName
And T1.ID = T2.ID
And T1.MedicationNumber = T2.InjectionNumber
你能分享你已经厌倦的代码吗?以及所需结果的说明?您需要在表1和表2上使用窗口功能,以便只有第一条记录匹配。但是,如果有后续匹配,为什么不希望表1中的数据显示出来?@SeanLange此时只加入,因为我还没有走那么远。。。我的代码实际上并没有这么简单,但它的简单程度已经达到了我的目的。。我知道简单联接不会这样做,我想我必须以某种方式对行进行编号。。。这正是下面的答案中提到的。@RajMore我想要表1中的所有数据和表2中的所有数据,但是表2中的第二行没有匹配的记录,因为表2中的第一条记录已经匹配。第二条记录对MD来说价值3k美元,需要表明它没有被输入。我的联接连接到与记录1相同的记录-如果表2中有3个,则表1中必须有3个匹配项。我将查看行编号代码,并了解如何将其合并。。正如我提到的。。这是非常简单的,因为有几个其他的连接来获取其他数据进行显示。谢谢会让你知道结果。你的问题在哪里?如果没有给出您的查询,我们如何修复它?您能分享您已经厌倦的代码吗?以及所需结果的说明?您需要在表1和表2上使用窗口功能,以便只有第一条记录匹配。但是,如果有后续匹配,为什么不希望表1中的数据显示出来?@SeanLange此时只加入,因为我还没有走那么远。。。我的代码实际上并没有这么简单,但它的简单程度已经达到了我的目的。。我知道简单联接不会这样做,我想我必须以某种方式对行进行编号。。。这正是下面的答案中提到的。@RajMore我想要表1中的所有数据和表2中的所有数据,但是表2中的第二行没有匹配的记录,因为表2中的第一条记录已经匹配。第二条记录对MD来说价值3k美元,需要表明它没有被输入。我的联接连接到与记录1相同的记录-如果表2中有3个,则表1中必须有3个匹配项。我将查看行编号代码,并了解如何将其合并。。正如我提到的。。这是非常简单的,因为有几个其他的连接来获取其他数据进行显示。谢谢会让你知道结果。你的问题在哪里?如果没有给出您的查询,我们如何修复它?