首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL循环表,在insert处获得最大值和增量。

SQL循环表,在insert处获得最大值和增量。
EN

Stack Overflow用户
提问于 2022-05-08 19:00:49
回答 1查看 170关注 0票数 0

我有两个表,我正在遍历table1,以查看那里是否存在来自table2的任何记录。如果table1.IMAGE_NUMBER已经存在于该用户,则在插入新记录之前添加max(table2.IMAGE_NUMBER) + table1.IMAGE_NUMBER,否则只需插入而不增加IMAGE_NUMBER

目标是避免重复的IMAGE_NUMBER --这里是我的代码:

代码语言:javascript
复制
DECLARE @NAME NVARCHAR(50), @ID INT, @IMAGE_NUMBER INT, AGE INT 
DECLARE MY_CURSOR CURSOR FOR SELECT NAME, IMAGE_NUMBER, AGE FROM PEOPLE

OPEN MY_CURSOR   
FETCH NEXT FROM MY_CURSOR INTO @NAME, @ID, @IMAGE_NUMBER, @AGE 

WHILE @@FETCH_STATUS = 0   
BEGIN
    
    IF NOT EXISTS(SELECT R.NAME, RG.ID, R.IMAGE_NUMBER, R.DOB, R.PHONE
        FROM REGISTRATION R
        LEFT JOIN PEOPLE P ON R.ID = P.ID
        WHERE P.NAME = R._NAME
        AND P.IMAGE_NUMBER = R.IMAGE_NUMBER
        AND P.IS_ACTIVE = 1)

    BEGIN 
        -- how do I increment the image_number + max(R.IMAGE_NUMBER) from registration???
        INSERT INTO REGISTRATION(NAME, IMAGE_NUMBER, DOB, AGE)
        VALUES(@NAME, @IMAGE_NUMBER, @DOB, @AGE)
        
    END
    
    ELSE IF EXIST(SELECT R.NAME, RG.ID, R.IMAGE_NUMBER, R.DOB, R.PHONE
        FROM REGISTRATION R
        LEFT JOIN PEOPLE P ON R.ID = P.ID
        WHERE P.NAME = R._NAME
        AND P.IMAGE_NUMBER = R.IMAGE_NUMBER
        AND P.IS_ACTIVE = 1)
        
    BEGIN
    
     UPDATE REGISTRATION SET DATE_PROCESSED=GETUTCDATE()
     
    END

    FETCH NEXT FROM MY_CURSOR INTO @NAME, @ID, @IMAGE_NUMBER, @AGE 
END   
CLOSE MY_CURSOR   
DEALLOCATE MY_CURSOR 
EN

回答 1

Stack Overflow用户

发布于 2022-05-08 19:55:42

理想情况下,您不会费心为每个NAME存储一个实际的数字。查询时只需使用ROW_NUMBER计算编号即可。

尽管如此,您的当前代码仍然存在很多问题:

完全不需要游标(很少有),您可以在一个批operation.

  • Even中完成这个任务--如果您想要一个游标--有一些主要的错误会阻止您的代码工作。第一个anyway.

  • LEFT JOIN实际上不是比较每一行,而是比较所有的行,所以它不会工作,所以在同一个表上的WHERE会把它转换成一个INNER JOIN logically.

  • Unclear --为什么您需要DOBAGE。事实上,我不知道你为什么会储存年龄,因为你可以用道布来计算它。

  • 不清楚为什么你有一个单独的UPDATE语句

我不太确定您的表模式,但您似乎想要这样的东西。

代码语言:javascript
复制
INSERT INTO REGISTRATION (NAME, IMAGE_NUMBER, DOB, AGE, DATE)
SELECT
  P.NAME,
  ISNULL(R.MAX_NUMBER + 1, P.IMAGE_NUMBER),
  P.DOB,
  P.AGE,
  GETUTCDATE()
FROM PEOPLE P
LEFT JOIN (    -- pre-aggregate existing images and get the max number
    SELECT MAX(R.IMAGE_NUMBER) MAX_NUMBER
    FROM REGISTRATION R
    GROUP BY R.NAME
) R ON P.NAME = R._NAME
WHERE P.IS_ACTIVE = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72164262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档