Sql server SQL Server 2012合并了解上未包含字段的不同记录的情况
我已经对此进行了几个小时的深入研究,但在使用group by获取一组不同的值时,并没有很好地发现在合并中应该发生什么,这并不包括ON中指定的内容 pat表(目标): ord表(来源): 合并语句: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
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语句正在生成以下记录:
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);