首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >insert查询中使用的计数器函数

insert查询中使用的计数器函数
EN

Stack Overflow用户
提问于 2014-05-13 15:04:33
回答 1查看 77关注 0票数 0

我需要使用一个函数对一个表进行插入。我所做的是:

代码语言:javascript
运行
AI代码解释
复制
UPDATE  MyTable SET MyColumn = dbo.fncGetMyValue(MyParameter) where //some logic

当然,这里的MyParameter是MyTable中的一个列。问题是,只要我更新一行,函数的值就应该改变,因为它实际上是MyParemeter的计数器函数。但是查询会为它更新的每一行插入函数的第一个相同的结果。我是说,它应该更新15,16,17...每一行,但它会更新15,15,15,...我想这是正常的,因为sql在插入过程结束之前看不到插入的值。

我的问题是,是否有一种方法可以在不使用while语句的情况下解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2014-05-14 22:57:51

好的,你在细节上相当节俭,所以我不得不猜测你的一些逻辑,但如果我遵循你的逻辑,你的函数获得最好的记录+ 1,你应该仍然能够以基于集合的方式做到这一点:

首先,我将使用SELECT来解释,实际上,您遇到的问题是MaxRecord +1对于所有行都是相同的,就像下面的SELECT一样:

代码语言:javascript
运行
AI代码解释
复制
SELECT  t.ID,
        t.MyColumn,
        t.MyParamter,
        MaxRecord = MaxT.MyColumn + 1
FROM    MyTable AS t
        INNER JOIN
        (   SELECT  MyParameter, MyColumn = MAX(MyColumn)
            FROM    MyTable
            WHERE   SomeLogic
            GROUP BY MyParamter
        ) AS MaxT
            ON MaxT.MyParamter = t.MyParamter
WHERE   SomeLogic;

您可以通过删除+1并添加ROW_NUMBER()来避免此问题:

代码语言:javascript
运行
AI代码解释
复制
MaxRecord = MaxT.MyColumn + ROW_NUMBER() OVER(PARTITION BY t.MyParameter ORDER BY t.ID)

最后,您还可以使用分析函数删除子查询,因此您的最终select将是:

代码语言:javascript
运行
AI代码解释
复制
SELECT  t.ID,
        t.MyParameter,
        t.MyColumn,
        MyNewColumn = MAX(t,MyColumn) OVER(PARTITION BY t.MyParameter) +
                        ROW_NUMBER() OVER(PARTITION BY t.MyParameter
                                            ORDER BY t.ID)
FROM    MyTable t
WHERE   SomeLogic;

然后,要进行更新,您可以将所有这些都包装在一个CTE中,然后更新它:

代码语言:javascript
运行
AI代码解释
复制
WITH CTE AS
(   SELECT  t.ID,
            t.MyParameter,
            t.MyColumn,
            MyNewColumn = MAX(t,MyColumn) OVER(PARTITION BY t.MyParameter) +
                            ROW_NUMBER() OVER(PARTITION BY t.MyParameter
                                                ORDER BY t.ID)
    FROM    MyTable t
    WHERE   SomeLogic
)
UPDATE  CTE
SET     MyColumn = MyNewColumn;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23634939

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文