Sql server SQL Server 2012合并了解上未包含字段的不同记录的情况

Sql server SQL Server 2012合并了解上未包含字段的不同记录的情况,sql-server,merge,Sql Server,Merge,我已经对此进行了几个小时的深入研究,但在使用group by获取一组不同的值时,并没有很好地发现在合并中应该发生什么,这并不包括ON中指定的内容 pat表(目标): ord表(来源): 合并语句: MERGE INTO pat AS TARGET USING (SELECT PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL from Ord GRO

我已经对此进行了几个小时的深入研究,但在使用group by获取一组不同的值时,并没有很好地发现在合并中应该发生什么,这并不包括ON中指定的内容

pat表(目标):

ord表(来源):

合并语句:

MERGE INTO pat AS TARGET
USING (SELECT PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL from Ord GROUP BY PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL) AS SOURCE ON TARGET.PAT_NAME = SOURCE.PAT_NAME AND TARGET.ADD_LINE_1 = SOURCE.ADD_LINE_1 AND TARGET.ADD_LINE_2 = SOURCE.ADD_LINE_2 AND TARGET.CITY = SOURCE.CITY AND TARGET.STATE = SOURCE.STATE AND TARGET.ZIP = SOURCE.ZIP
WHEN NOT MATCHED THEN
    INSERT(PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, HOME_PHONE, MOBILE_PHONE, EMAIL)
    VALUES (SOURCE.PAT_NAME, SOURCE.BIRTH_DATE, SOURCE.ADD_LINE_1, SOURCE.ADD_LINE_2, SOURCE.CITY, SOURCE.STATE, SOURCE.ZIP, SOURCE.PAT_HOME_PHONE, SOURCE.MOBILE_PHONE, SOURCE.EMAIL);
正如你所看到的,我的手机只有姓名和地址字段,没有电话和电子邮件。那么发生了什么:

我与group by的select语句正在生成以下记录:

  • 在地址字段上匹配,但具有不同的电话,在这种情况下不会插入(如预期的那样)
  • 在查询时在地址字段中不匹配,并生成两行,因为地址匹配,但它们有两个单独的电话号码,因此插入两行。我最终得到两行地址字段相同(我的ON中的字段),但数字不同 因此,我的问题/澄清是,在本例中,合并是否总是插入任何在查询时不匹配的内容,因为我使用的是不匹配的内容?由于我的select返回了两行新地址和不同的电话号码,因此它同时插入了这两行。但是,如果我使用现有地址和不同的电话号码再次运行相同的查询,它们将不会被插入

    或者换一种说法?如果上面的select语句返回了50条记录,所有记录在my ON中都有相同的地址字段,address not in target中,但有50个不同的电话号码,它是否总是将这50条记录插入my target中?它永远不会插入一条带有新地址的记录并查看这些记录,而不会插入其余的记录,对吗

    我可以尝试澄清:

    使用值编辑: 源表

    Pat_name Add_Line_1 Add_Line_2   CITY   STATE  ZIP   home_phone  mobile_phone   email
    Bob S    333 west                Go      CA    99521 555-5503                    bob@gmail.com
    Bob S    444 east                Stop    CA    99950 555-5552                    bob@GMAIL.COM
    BOB S    444 east                Stop    CA    99950 555-5560                    bob@gmail.com
    
    目标表:

    Pat_name Add_Line_1 Add_Line_2   CITY   STATE  ZIP   home_phone  mobile_phone   email
    Bob S    333 west                Go      CA    99521 555-5511                      bob@gmail.com
    

    在这种情况下,当运行select时,将返回所有3行。第一行与on中指定的地址字段匹配,因此即使其电话号码不同,也不会插入。但是,将插入最后两行,因为在运行select语句时,这些地址字段不在目标中,因此它将插入select的所有结果,而地址字段上没有匹配项。将第一个地址字段插入目标后,它将永远不会停止,因为这些地址字段现在已正确显示?

    您必须将pat_home_号码和mobile_号码添加到匹配条件中,如下所示。如果与您描述的不一样,则不会根据需要插入具有相同姓名和不同电话号码的成员

    MERGE INTO pat AS TARGET
    USING (
        SELECT 
            PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY
            , STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL 
        FROM Ord 
        GROUP BY PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2,
        CITY, STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL
    ) AS SOURCE 
    
    ON TARGET.PAT_NAME = SOURCE.PAT_NAME
    AND TARGET.ADD_LINE_1 = SOURCE.ADD_LINE_1 
    AND TARGET.ADD_LINE_2 = SOURCE.ADD_LINE_2 
    --ADD these lines
    AND TARGET.HOM = SOURCE.PAT_HOME_PHONE
    AND TARGET.MOBILE_PHONE = SOURCE.MOBILE_PHONE
    --
    AND TARGET.CITY = SOURCE.CITY 
    AND TARGET.STATE = SOURCE.STATE 
    AND TARGET.ZIP = SOURCE.ZIP
    WHEN NOT MATCHED THEN
        INSERT(PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, HOME_PHONE, MOBILE_PHONE, EMAIL)
        VALUES (SOURCE.PAT_NAME, SOURCE.BIRTH_DATE, SOURCE.ADD_LINE_1, SOURCE.ADD_LINE_2, SOURCE.CITY, 
        SOURCE.STATE, SOURCE.ZIP, SOURCE.PAT_HOME_PHONE, SOURCE.MOBILE_PHONE, SOURCE.EMAIL);
    

    谢谢你的回答。我想我是在验证我是否理解操作顺序。正如我用上面的一个例子展开的那样。由于最后两行返回的have和address不在目标表中,是否都将插入?它不是因为一个被插入,然后它有地址,所以下一个不会被插入。每次插入同一个select后不会重新计算?
    Pat_name Add_Line_1 Add_Line_2   CITY   STATE  ZIP   home_phone  mobile_phone   email
    Bob S    333 west                Go      CA    99521 555-5511                      bob@gmail.com
    
    MERGE INTO pat AS TARGET
    USING (
        SELECT 
            PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY
            , STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL 
        FROM Ord 
        GROUP BY PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2,
        CITY, STATE, ZIP, PAT_HOME_PHONE, MOBILE_PHONE, EMAIL
    ) AS SOURCE 
    
    ON TARGET.PAT_NAME = SOURCE.PAT_NAME
    AND TARGET.ADD_LINE_1 = SOURCE.ADD_LINE_1 
    AND TARGET.ADD_LINE_2 = SOURCE.ADD_LINE_2 
    --ADD these lines
    AND TARGET.HOM = SOURCE.PAT_HOME_PHONE
    AND TARGET.MOBILE_PHONE = SOURCE.MOBILE_PHONE
    --
    AND TARGET.CITY = SOURCE.CITY 
    AND TARGET.STATE = SOURCE.STATE 
    AND TARGET.ZIP = SOURCE.ZIP
    WHEN NOT MATCHED THEN
        INSERT(PAT_NAME, BIRTH_DATE, ADD_LINE_1, ADD_LINE_2, CITY, STATE, ZIP, HOME_PHONE, MOBILE_PHONE, EMAIL)
        VALUES (SOURCE.PAT_NAME, SOURCE.BIRTH_DATE, SOURCE.ADD_LINE_1, SOURCE.ADD_LINE_2, SOURCE.CITY, 
        SOURCE.STATE, SOURCE.ZIP, SOURCE.PAT_HOME_PHONE, SOURCE.MOBILE_PHONE, SOURCE.EMAIL);