从相同 table 更新相同数据
Update same data from the same table
我有一个 table 注册了几个 CAR(重复和不重复),所以我打算更新所有重复注册的字段(活动),留下 1 个最近的行。
table 数据示例:
我希望我的数据是这样的:
我尝试编写此代码,但它无法正常工作。因为更新了第一行
-----create table
create table dbo.test( id int, CAR varchar(30), ACTIVE int)
insert into dbo.test(id, CAR, ACTIVE)
values
(1, 'AAA-25-35', 0),
(2, 'LDB-25-35', 0),
(3, 'LDB-00-35', 0),
(4, 'LDB-25-35', 0),
(5, 'LDB-00-35', 0),
(6, 'LDC-10-10', 0),
(7, 'LDC-10-10', 0),
(8, 'LDB-00-35', 0)
select * from dbo.test
----update table
WITH CTE AS
(
SELECT
row_number() over (partition by CAR order by id) as t
, CAR , ACTIVE
FROM dbo.test
)
update CTE
SET ACTIVE = 1
WHERE t=1
select * from dbo.test
您可以只添加 EXISTS
部分:
-----create table
CREATE TABLE #Test(ID INT, CAR VARCHAR(30), ACTIVE INT)
INSERT INTO #Test(ID, CAR, ACTIVE)
VALUES
(1, 'AAA-25-35', 0),
(2, 'LDB-25-35', 0),
(3, 'LDB-00-35', 0),
(4, 'LDB-25-35', 0),
(5, 'LDB-00-35', 0),
(6, 'LDC-10-10', 0),
(7, 'LDC-10-10', 0),
(8, 'LDB-00-35', 0)
----update table
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY CAR ORDER BY ID) AS t,
CAR,
ACTIVE
FROM #Test
)
UPDATE CTE
SET ACTIVE = 1
WHERE t=1
AND EXISTS (SELECT 1 FROM CTE c WHERE c.CAR = CTE.CAR GROUP BY CAR HAVING COUNT(*) > 1)
SELECT *
FROM #Test
您可以在查询中使用 count
分析函数,如下所示:
WITH CTE AS
(
SELECT
row_number() over (partition by CAR order by id) as t
, count(*) over (partition by car) as cnt
, CAR , ACTIVE
FROM dbo.test
)
update CTE
SET ACTIVE = 1
WHERE t=1 and cnt>1
我有一个 table 注册了几个 CAR(重复和不重复),所以我打算更新所有重复注册的字段(活动),留下 1 个最近的行。
table 数据示例:
我希望我的数据是这样的:
我尝试编写此代码,但它无法正常工作。因为更新了第一行
-----create table
create table dbo.test( id int, CAR varchar(30), ACTIVE int)
insert into dbo.test(id, CAR, ACTIVE)
values
(1, 'AAA-25-35', 0),
(2, 'LDB-25-35', 0),
(3, 'LDB-00-35', 0),
(4, 'LDB-25-35', 0),
(5, 'LDB-00-35', 0),
(6, 'LDC-10-10', 0),
(7, 'LDC-10-10', 0),
(8, 'LDB-00-35', 0)
select * from dbo.test
----update table
WITH CTE AS
(
SELECT
row_number() over (partition by CAR order by id) as t
, CAR , ACTIVE
FROM dbo.test
)
update CTE
SET ACTIVE = 1
WHERE t=1
select * from dbo.test
您可以只添加 EXISTS
部分:
-----create table
CREATE TABLE #Test(ID INT, CAR VARCHAR(30), ACTIVE INT)
INSERT INTO #Test(ID, CAR, ACTIVE)
VALUES
(1, 'AAA-25-35', 0),
(2, 'LDB-25-35', 0),
(3, 'LDB-00-35', 0),
(4, 'LDB-25-35', 0),
(5, 'LDB-00-35', 0),
(6, 'LDC-10-10', 0),
(7, 'LDC-10-10', 0),
(8, 'LDB-00-35', 0)
----update table
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY CAR ORDER BY ID) AS t,
CAR,
ACTIVE
FROM #Test
)
UPDATE CTE
SET ACTIVE = 1
WHERE t=1
AND EXISTS (SELECT 1 FROM CTE c WHERE c.CAR = CTE.CAR GROUP BY CAR HAVING COUNT(*) > 1)
SELECT *
FROM #Test
您可以在查询中使用 count
分析函数,如下所示:
WITH CTE AS
(
SELECT
row_number() over (partition by CAR order by id) as t
, count(*) over (partition by car) as cnt
, CAR , ACTIVE
FROM dbo.test
)
update CTE
SET ACTIVE = 1
WHERE t=1 and cnt>1