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;
强烈不推荐这种机制,因为它不是线程安全的。不同的insert
s 可以插入相同的值。
但是,如果您遇到的情况是您的表没有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 2008 R2 中计算平均值的窗口函数