Sql 对多行使用“合并到”
我正在尝试创建一个存储过程,它将更新某个表,并使用INT列表。相同的逻辑用于单个更新,但对于这一个表,需要更新多行 但是,我遇到了以下错误: 子查询返回了多个值。当子查询后跟=、!=、=或子查询用作表达式时,这是不允许的 有没有办法让这个合并可以处理多行?还是我需要完全改变逻辑Sql 对多行使用“合并到”,sql,sql-server,merge,Sql,Sql Server,Merge,我正在尝试创建一个存储过程,它将更新某个表,并使用INT列表。相同的逻辑用于单个更新,但对于这一个表,需要更新多行 但是,我遇到了以下错误: 子查询返回了多个值。当子查询后跟=、!=、=或子查询用作表达式时,这是不允许的 有没有办法让这个合并可以处理多行?还是我需要完全改变逻辑 ALTER PROCEDURE [dbo].[P_ClientBalanceDetails_ExecuteComplex_RefreshFromClawbacks] @ID AS dbo.IntLis
ALTER PROCEDURE [dbo].[P_ClientBalanceDetails_ExecuteComplex_RefreshFromClawbacks]
@ID AS dbo.IntList READONLY,
@WorkflowInstanceID int null,
@AdjustmentFileID int null,
@PeriodID int null
AS
BEGIN
SET NOCOUNT ON;
--AGENTS
MERGE INTO ClientBalanceDetails AS TARGET
USING (
SELECT
Clawbacks.ID,
Clawbacks.ClientBalanceID,
Clawbacks.AgentClientBalanceDetailID,
Clawbacks.ValueDate,
Clawbacks.ClientID,
Clawbacks.Amount,
Clawbacks.Reason,
Clawbacks.ConfirmationStatus,
Clawbacks.UnderProrationReview,
Clawbacks.CreatedBy,
Clawbacks.CreatedDate,
Clawbacks.UpdatedBy,
Clawbacks.UpdatedDate,
Clawbacks.DeletedBy,
Clawbacks.DeletedDate,
Clawbacks.PostBillingDisputeID,
T05_Periods.FirstDay FirstDay
FROM
Clawbacks WITH (NOLOCK)
INNER JOIN ClientBalances WITH (NOLOCK) ON Clawbacks.ClientBalanceID = ClientBalances.ID
INNER JOIN T05_Periods WITH (NOLOCK) ON ClientBalances.PeriodID = T05_Periods.ID
WHERE
ClientBalances.DeletedDate IS NULL
AND (@WorkflowInstanceID IS NULL OR Clawbacks.WorkflowInstanceID = @WorkflowInstanceID)
AND (@AdjustmentFileID IS NULL OR Clawbacks.AdjustmentFileID = @AdjustmentFileID)
AND (@PeriodID IS NULL OR T05_Periods.ID = @PeriodID)
AND (Clawbacks.ID IN (SELECT ID FROM @ID))
AND (Clawbacks.ConfirmationStatus IN (@ConfirmedStatus, @UnConfirmedStatus, @RejectedStatus) )
AND (Clawbacks.UnderProrationReview IS NULL OR Clawbacks.UnderProrationReview = 0)
) AS SOURCE
--Insert new compensations
ON SOURCE.AgentClientBalanceDetailID = TARGET.ID
select语句返回多条具有相同源的记录。AgentClientBalanceDetailID。如果源记录是重复的,则添加DISTINCT关键字可以解决此问题
如果具有相同AgentClientBalanceDetailID的记录甚至有一列不同,则您的逻辑有缺陷,数据库将不允许合并。之所以这样做,是因为无论记录的顺序如何,SQL都必须始终保持一致。同一个键(AgentClientBalanceDetailID)的列值不同,这意味着您将根据选择结果集中记录的顺序获得不同的更新结果。我在这里警告使用
NOLOCK
,因为您可能会得到脏读,因此,dirty insertsI也会警告不要使用MERGE
,尤其是当模式只是为了更新时。还有什么建议呢?对于更新行,最直接的方法是使用update语句。为什么不直接使用另一个表值参数的内部联接,而不是使用IN?