Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较两个表之间的数据,每个表中有多条相同的记录_Sql Server - Fatal编程技术网

Sql server 比较两个表之间的数据,每个表中有多条相同的记录

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

情况是这样的。。。我在表之间没有唯一的标识符来进行匹配,所以我匹配的值可以在两个表中出现多次。我觉得我必须分配一些值,然后在下一条记录尝试匹配时,将该记录从可用于匹配的位置删除

表1包含以下数据:

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个匹配项。我将查看行编号代码,并了解如何将其合并。。正如我提到的。。这是非常简单的,因为有几个其他的连接来获取其他数据进行显示。谢谢会让你知道结果。你的问题在哪里?如果没有给出您的查询,我们如何修复它?