【问题标题】:Update same data from the same table从同一个表更新相同的数据
【发布时间】:2021-04-26 10:31:53
【问题描述】:

我有一个表注册了几个 CAR(重复且不重复),因此我打算更新所有重复注册的字段(活动),留下 1 个最近的行。
表格数据示例:

我希望我的数据是这样的:

我尝试编写此代码,但无法正常工作。因为更新了第一行

    -----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

【问题讨论】:

  • 因为如果有人在 MySql 中有解决方案,我将能够将其转换为 SQLServer。
  • 别担心,sql server 团队已经搞定了
  • @JoaquimCosta 请不要那样做...只是 taq 您正在使用的 RDBMS。
  • @JoaquimCosta 改为添加“sql”标签(我现在已经这样做了),因为熟悉多个数据库引擎的人会监控该标签。
  • 好的,谢谢。

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

您可以添加一个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

【讨论】:

  • 非常感谢,效果很好。
【解决方案2】:

您可以在查询中使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多