首页 > 解决方案 > LockAmountOnline_Active:聚合可能不会出现在 WHERE 子句中,除非它在子查询中

问题描述

IF @FlagGenerate = 0
    BEGIN
        INSERT INTO Lock_Amount_Trx
        (
            Id,Custcode,NoRekDebet,TotalLockAmount,LockStatus,GenerateDate
        )
        SELECT @fileId,tla.cuscode,tla.norekdeb, tla.lockammount,'Active', getdate() FROM ##TempLockActive tla 
        WHERE NOT EXISTS (SELECT lat.NoRekDebet FROM Lock_Amount_Trx lat WHERE lat.Custcode = tla.cuscode AND lat.TotalLockAmount = tla.lockammount AND lat.GenerateDate =max(lat.GenerateDate))
        OR NOT EXISTS (SELECT lat.TotalLockAmount FROM Lock_Amount_Trx lat WHERE lat.Custcode = tla.cuscode AND lat.NoRekDebet = tla.norekdeb AND lat.GenerateDate =max(lat.GenerateDate) )
    END

我正在尝试从##TempLockactive表中输入,Lock_ammount_trx如果 NoRekDebet 或 TotalLockAmmount 或两者的组合##TempLockActive在最新生成日期的同一行中没有相同的值,它将插入 cuscode 为主键。

我收到这个错误

消息 147,级别 15,状态 1,过程 LockAmountOnline_Active,第 96 行
聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。

有人可以帮助我吗?

标签: sqlsql-server

解决方案


正如错误消息所示,聚合可能不会出现在 WHERE 子句中,除非它包含在子查询中。

如果最大生成日期存在于表 Lock_Amount_Trx 中,请在继续插入之前尝试将最大值作为变量获取。

我的建议:

IF @FlagGenerate = 0
BEGIN
        DEALLOCATE @maxGenerateDate datetime 
        SET @maxGenerateDate = (SELECT MAX(GenerateDate) FROM Lock_Amount_Trx )

        INSERT INTO Lock_Amount_Trx
        (
            Id,Custcode,NoRekDebet,TotalLockAmount,LockStatus,GenerateDate
        )

        SELECT @fileId,tla.cuscode,tla.norekdeb, tla.lockammount,'Active', getdate() 
        FROM ##TempLockActive tla 
        WHERE NOT EXISTS (SELECT lat.NoRekDebet FROM Lock_Amount_Trx lat WHERE lat.Custcode = tla.cuscode AND lat.TotalLockAmount = tla.lockammount AND lat.GenerateDate = @maxGenerateDate)
        OR NOT EXISTS (SELECT lat.TotalLockAmount FROM Lock_Amount_Trx lat WHERE lat.Custcode = tla.cuscode AND lat.NoRekDebet = tla.norekdeb AND lat.GenerateDate =@maxGenerateDate )
END

推荐阅读