我有两个表,我正在遍历table1,以查看那里是否存在来自table2的任何记录。如果table1.IMAGE_NUMBER已经存在于该用户,则在插入新记录之前添加max(table2.IMAGE_NUMBER) + table1.IMAGE_NUMBER,否则只需插入而不增加IMAGE_NUMBER。
目标是避免重复的IMAGE_NUMBER --这里是我的代码:
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 发布于 2022-05-08 19:55:42
理想情况下,您不会费心为每个NAME存储一个实际的数字。查询时只需使用ROW_NUMBER计算编号即可。
尽管如此,您的当前代码仍然存在很多问题:
完全不需要游标(很少有),您可以在一个批operation.
LEFT JOIN实际上不是比较每一行,而是比较所有的行,所以它不会工作,所以在同一个表上的WHERE会把它转换成一个INNER JOIN logically.
DOB和AGE。事实上,我不知道你为什么会储存年龄,因为你可以用道布来计算它。
UPDATE语句我不太确定您的表模式,但您似乎想要这样的东西。
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;https://stackoverflow.com/questions/72164262
复制相似问题