Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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合并条件删除_Sql_Sql Server_Tsql_Visual Studio 2015 - Fatal编程技术网

匹配时SQL合并条件删除

匹配时SQL合并条件删除,sql,sql-server,tsql,visual-studio-2015,Sql,Sql Server,Tsql,Visual Studio 2015,我有两个用于合并的表。我的查询有问题,我找不到任何关于原因的信息。发生的事情是;我将运行查询,当我的目标表填充了我想要的信息时,它可以正常工作。然后我再次运行该查询(紧接着),它会发生变化(38行受影响)。我再次运行该查询,它会将这些行重新添加到中,并一次又一次。。。行被删除。共有100多行,但似乎只有相同的行受到影响。源表中没有任何更改 MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source ON (targe

我有两个用于合并的表。我的查询有问题,我找不到任何关于原因的信息。发生的事情是;我将运行查询,当我的目标表填充了我想要的信息时,它可以正常工作。然后我再次运行该查询(紧接着),它会发生变化(38行受影响)。我再次运行该查询,它会将这些行重新添加到中,并一次又一次。。。行被删除。共有100多行,但似乎只有相同的行受到影响。源表中没有任何更改

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
我怀疑我在匹配时对
执行
DELETE
——我只能在不匹配时找到
DELETE的信息,但我不知道,因为这似乎每次只影响相同的38行

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
您需要的表和(希望)信息在我的代码中:

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
将QA.dbo.RMA合并为目标,使用touchtn02.dbo.RMA_细节作为源
打开(target.RMANUM_52=source.RMANUM_52)
匹配和时(source.STATUS_52>3)
然后
删除
不匹配和时(source.STATUS_52<4)和(source.RECQTY_52>0)
然后
插入(RMANUM_52、RMADATE_52、CUSTID_52、RETNUM_52、REQTY_52、,
序列号52,维修号52,
R位置52,信用52,工作编号52,钥匙52,记录数量52,
记录52,状态52,
REM1_52,REM2_52,REM3_52,评论,CMPDTE)
值(source.RMANUM_52、source.RMADTE_52、source.CUSTID_52、,
source.RETNUM_52,
source.RETQTY_52、source.SERIAL_52、source.REPAIR_52、,
source.RPLACE_52,source.CREDIT_52,
source.WRKNUM_52、source.KEYWRD_52、source.RECQTY_52、,
source.RECDTE_52,
source.STATUS_52,source.REM1_52,source.REM2_52,
source.REM3_52,source.REM4_52,
资料来源:CMPDTE_52);
和往常一样,我感谢任何帮助/意见,我想我已经得到了

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
要删除的38行在源表中至少有两个状态_52值用于这些RMANUM_52键值

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
对于给定的RMANUM_52键值:

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
  • 状态_52值之一将小于4且数量大于0
  • 另一行状态值将大于3
因此,在第一次运行时,插入一行,其状态_52值小于4

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);
然后在下一次运行时,会触发删除,因为匹配是由RMANUM_52和源表中的状态_52进行的。这里需要技巧的是,我们要在源表的所有行(包括不属于第一次插入的行)中查找状态值。源表中有一个不同的行将RMANUM_52与状态_52>3匹配。因此,删除逻辑匹配并执行删除

MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);

我无法从您的示例中准确地说出您的需求,因此我不会冒险猜测修复程序。

在插入时,表上是否有一个触发器可以更新状态?编辑:我们可能需要关于哪些记录受到错误影响的更多信息。在@justiceorjustus的建议下查看记录后,两个表上都没有触发器,我注意到总是最后38行受到上部(64)的影响行从不受影响-此信息有用吗?在受影响的行中,
RMANUM_52
STATUS_52
的值是多少?作为创建编码期间的一般规则,在更新/删除之前始终运行select语句,以便您可以检查将删除/更新的内容。您让我走上了正确的轨道-谢谢@David Coster!实际问题是RMANUM_52不是唯一的(表中没有唯一的标识符),因此,我最后查看了两个不同的列。再次感谢-我以为大家都放弃了!我真的很高兴我能提供一些帮助:-)
MERGE QA.dbo.RMA AS target USING Touchstn02.dbo.RMA_Detail AS source 
ON (target.RMANUM_52 = source.RMANUM_52) 
WHEN MATCHED AND (source.STATUS_52 >3) 
THEN
DELETE
WHEN NOT MATCHED AND (source.STATUS_52 < 4) AND (source.RECQTY_52 > 0) 
THEN
INSERT         (RMANUM_52, RMADATE_52, CUSTID_52, RETNUM_52, RETQTY_52, 
                SERIAL_52, REPAIR_52, 
                RPLACE_52, CREDIT_52, WRKNUM_52, KEYWRD_52, RECQTY_52, 
                RECDTE_52, STATUS_52, 
                REM1_52, REM2_52, REM3_52, Comment, CMPDTE)
VALUES        (source.RMANUM_52, source.RMADTE_52, source.CUSTID_52, 
               source.RETNUM_52, 
               source.RETQTY_52, source.SERIAL_52, source.REPAIR_52, 
               source.RPLACE_52, source.CREDIT_52, 
               source.WRKNUM_52, source.KEYWRD_52, source.RECQTY_52, 
               source.RECDTE_52, 
               source.STATUS_52, source.REM1_52, source.REM2_52, 
               source.REM3_52, source.REM4_52, 
               source.CMPDTE_52);