【问题标题】:Update a column based on another column in a different table根据不同表中的另一列更新一列
【发布时间】:2023-02-22 00:38:10
【问题描述】:

我正在尝试根据表 B 的另一列中的值更新表 A 中的列。

表一:

Member ID Code
1 101
1 105
2 201
2 205
3 301
3 305

表 B:

Member ID Code
1 101: Leg
1 105: Back
2 201: Arm
2 205: Hip
3 301: Wrist
3 305: Foot

所以我想做的是将表 A 中的代码更新为表 B 中的代码。因此,成员 ID #1 的代码不是 101 和 105,而是 101:Leg 和 105:Back。

以下是我迄今为止尝试过但没有成功的方法。

UPDATE TableA
SET code = SUBSTRING(TableB.code, 1, PATINDEX('%[^0-9]%', TableB.code+'X')-1)
FROM TableA
JOIN TableB
ON TableA.Member_ID = TableB.Member_ID

【问题讨论】:

  • 我什至不会担心会员ID。看来您可以根据 b 中的内容更新表 a 中的代码。也就是说,如果代码都是统一的。
  • 为什么不修复设计并将105Back 放在单独的列中?在数据库中存储分隔数据,它打破了基本的规范化规则。
  • @Larnu 我没有创建数据库,这只是其他人设计它的方式。我没有权限更改它
  • @RossBush 很喜欢? UPDATE TableA SET code = TableB.code FROM TableB WHERE TableA.code = TableB.code
  • @Brockytoosocky 它是什么版本的 SQL Server?

标签: sql sql-server


【解决方案1】:

如果您“必须”在数据库中存储分隔数据,那么您实际上可以使用 LIKE 来实现:

UPDATE A
SET Code = B.Code
FROM dbo.TableA A
     JOIN dbo.TableB B ON A.MemberID = B.MemberID
                      AND B.Code LIKE A.Code + '%';
GO

db<>fiddle

当然,您真正应该做的是修复您的设计;不要在数据库中存储分隔数据。大概你应该有一个不同的代码表,然后是 id 的外键(我假设它是第一个值)。据推测,该值也应该是 int 而不是 varchar。这导致这样的事情:

CREATE TABLE dbo.Code (CodeID int NOT NULL CONSTRAINT PK_Code PRIMARY KEY,
                       CodeValue varchar(7) NOT NULL);
GO

INSERT INTO dbo.Code (CodeID, CodeValue)
SELECT DISTINCT
       LEFT(Code,CHARINDEX(':',Code) -1),
       TRIM(STUFF(Code,1,CHARINDEX(':',Code),''))
FROM dbo.TableB;
GO

UPDATE dbo.TableB
SET Code = LEFT(Code,CHARINDEX(':',Code) -1)
GO

ALTER TABLE dbo.TableB ALTER COLUMN Code int NOT NULL;
ALTER TABLE dbo.TableA ALTER COLUMN Code int NOT NULL;

ALTER TABLE dbo.TableB ADD CONSTRAINT FK_TableB_Code FOREIGN KEY (Code) REFERENCES dbo.Code (CodeID);
ALTER TABLE dbo.TableA ADD CONSTRAINT FK_TableA_Code FOREIGN KEY (Code) REFERENCES dbo.Code (CodeID);

然后你可以用 JOIN 获取代码 id 和值:

SELECT A.MemberID,
       CONCAT(C.CodeID,': ',C.CodeValue) AS Code
FROM dbo.TableA A
     JOIN dbo.Code C ON A.Code = C.CodeID;

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2011-11-25
    • 2021-11-21
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多