我想更新表中的列,如果它可以在列Cownnum中找到重复的数字,则将其设置为加1;否则,如果未找到重复的数据,则将其设置为1
我尝试了下面的代码,但显示错误
Msg 512,第16级,状态1,第53行 子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。 该声明已终止。
update dbo.temp1 set SEQNO = case SEQNO when (SELECT
cownnum
FROM
dbo.temp1
GROUP BY
cownnum
HAVING
COUNT(*) > 1) then SEQNO = 2 else SEQNO = 1 end
例如结果将是
cownnum 1 1 2 3
SEQNO 1 2 1 1
答案 0 :(得分:1)
您可以使用lag()
来检查sqlserver
中的上一行值
Update temp1
set temp1.SEQNO = B.SEQNO
FROM temp1 A, (select id , COWNNUM,
case when COWNNUM = lag(COWNNUM) over(order by id)
then ROW_NUMBER() OVER ( PARTITION BY COWNNUM ORDER BY id ) else 1 end as SEQNO
from temp1) B
WHERE A.id = B.id
答案 1 :(得分:0)
您的问题令人困惑,但是没有理由使用GROUP BY
子句:
UPDATE dbo.temp1 SET SEQNO = 1 WHERE SEQNO = cownnum
或者也许您需要以某种方式检查cownnum
:
UPDATE dbo.temp1 SET SEQNO = 1 WHERE cownnum = (SELECT TOP 1 xxx FROM table WHERE ???)
请提供您的数据和预期结果的示例。
答案 2 :(得分:0)
您可以使用ROW_NUMBER。
UPDATE t1
SET t1.SEQNO = t2.rowno
FROM table_with_duplicates t1
INNER JOIN
(
SELECT unique_id,
ROW_NUMBER() OVER (PARTITION BY cownnum ORDER BY cownnum) AS rowno
FROM table_with_duplicates
) t2
ON t1.unique_id = t2.unique_id;
答案 3 :(得分:0)
满足您需求的完美解决方案是
UPDATE @Temp1
SET SEQNO = B.NewSEQ
FROM @Temp1 A ,
( SELECT id,
CASE WHEN COWNNUM = LAG(COWNNUM) OVER ( ORDER BY id ) THEN
ROW_NUMBER() OVER ( PARTITION BY COWNNUM ORDER BY id ) ELSE 1 END AS NewSEQ
FROM @temp1
) B
WHERE A.id = B.id
您可以通过单击 DEMO
来检查此查询的执行情况答案 4 :(得分:0)
您可以使用窗口功能。使用可更新的CTE最简单:
with toupdate as (
select t.*,
row_number() over (partition by cownum order by (select null)) as new_seqno
from dbo.temp1 t
)
update toupdate
set seqno = new_seqno;
如果我正确理解了这个问题,则不需要join
。