Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中

Posted

技术标签:

【中文标题】Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中【英文标题】:Sql server - Windowed functions can only appear in the SELECT or ORDER BY clauses 【发布时间】:2021-01-15 23:29:44 【问题描述】:

我正在尝试向表中插入记录,并且需要在 Sql 服务器数据库中的现有表 ALO_DimSubscriberWeighting 中插入应该按顺序排列的列 SubscriberWeightingID。理想情况下,SubscriberWeightingID 应该基于该表是最新的,并且应该按顺序继续其余的。这是我尝试过的,但出现错误 我如何做到这一点 我已经使用了 orber by 子句,但它仍然在抱怨。有没有另一种方法来做到这一点。我基本上有 50 个这样的插入要执行

insert into ALO_DimSubscriberWeighting ([SubscriberWeightingID],[SubscriberNK],[WeightingAmount],[IsActive]) values ((ROW_NUMBER() OVER(ORDER BY [SubscriberWeightingID]),'NSFR80R0040C0090','0',1)   
insert into ALO_DimSubscriberWeighting ([SubscriberWeightingID],[SubscriberNK],[WeightingAmount],[IsActive]) values ((ROW_NUMBER() OVER(ORDER BY [SubscriberWeightingID]),'NSFR80R0040C0100','0',1)   
insert into ALO_DimSubscriberWeighting ([SubscriberWeightingID],[SubscriberNK],[WeightingAmount],[IsActive]) values ((ROW_NUMBER() OVER(ORDER BY [SubscriberWeightingID]),'NSFR80R0040C0110','0',1) 

错误

Invalid column name 'SubscriberWeightingID'.
Msg 4108, Level 15, State 1, Line 1
Windowed functions can only appear in the SELECT or ORDER BY clauses

【问题讨论】:

我对你想要做什么有点困惑,但也许不要使用ROW_NUMBER(),而是尝试使用SELECT MAX(SubscriberWeightingID) + 1 FROM ALO_DimSubscriberWeighting...如果你没有将它设置为自动递增。 不幸的是,该表的自动增量功能未设置为自动。因此,当插入新记录时,它应该根据最后的 Id + 1 进行插入 如何在值语句中添加 SELECT MAX(SubscriberWeightingID) + 1 修改表,使其使用IDENTITY 列或DEFAULT 约束和SEQUENCE,并让服务器为您生成它。使用建议的SELECT MAX() 容易受到竞争条件的影响,并且可能会为并发插入生成重复值。 代替值,使用:SELECT MAX(SubscriberWeightingID) + 1,'NSFR80R0040C0090','0',1 FROM ALO_DimSubscriberWeighting 【参考方案1】:

如果你想手动增加一个id,你可以使用:

insert into ALO_DimSubscriberWeighting ([SubscriberWeightingID],[SubscriberNK],[WeightingAmount],[IsActive]) 
    select coalesce(max(SubscriberWeightingID) + 1, 1), 'NSFR80R0040C0090', '0', 1) 
    from ALO_DimSubscriberWeighting;

强烈不推荐这种机制,因为它不是线程安全的。不同的inserts 可以插入相同的值。

但是,如果您遇到的情况是您的表没有identity 列并且没有默认为序列的列,那么这是执行您想要的一种方法。它只能在您修复数据库以自动生成值之前使用。

【讨论】:

【参考方案2】:

您可以使用标识列来实现这一点。但是,如果您想在代码中尝试实现这一目标,请尝试以下操作:

insert into ALO_DimSubscriberWeighting ([SubscriberWeightingID],[SubscriberNK],[WeightingAmount],[IsActive]) 
values ((select isnull(max([SubscriberWeightingID]),0)+1 
from ALO_DimSubscriberWeighting),'NSFR80R0040C0090','0',1)  

【讨论】:

以上是关于Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 分区窗口中多个属性的 Min() 和 Max()

SQL Server 中的窗口函数(2012 新函数)

SQL Server2008窗口计算

在 SQL Server 2008 R2 中计算平均值的窗口函数

如何在 SQL Server 中使用带有框架的窗口函数执行 COUNT(DISTINCT)

SQL Server:具有不同长度的分析窗口函数