如何使用表 B 中的信息更新表 A 中的列 [重复]

Posted

技术标签:

【中文标题】如何使用表 B 中的信息更新表 A 中的列 [重复]【英文标题】:How do I update a col in table A, using info From table B [duplicate] 【发布时间】:2014-07-17 17:57:07 【问题描述】:

我使用的是 Microsoft SQL Server 2005

我有两张桌子,比如说TableATableB

CREATE TABLE TableA (
A_ItemNumber (int)
A_IsDeleted  (bit)
)

CREATE TABLE TableB (
B_ItemNumber (int)
B_OrderNumber (varchar)
)

INSERT INTO TableB VALUES 
(1, 'XY004005'),
(2, 'XY005125'),
(3, 'XY499999'),
(4, 'XY511340')

我需要编写一个执行以下操作的更新查询:

    获取所有 B_OrderNumbersB_ItemNumber,其中字符串的 int 部分 XY004005 将包含在 004005 < 500000 之后,但 XY511340 不会)

    将此商品编号用于UPDATE A_IsDeleted WHERE A_ItemNumber = B_ItemNumber

我基本上想将所有A_ItemNumber = B_ItemNumber where B_OrderNumber < XY500000A_IsDeleted 更改为TRUE

我认为这可能是一个简单的加入/更新,但看起来不允许这样做。

【问题讨论】:

我确实看到了那个答案。我会再读一遍。感谢设计这个数据库的人,我也有字符串应该有整数,所以我会挖掘更多,看看我能想出什么 【参考方案1】:

细节上相当稀疏,但这样的事情应该会让你接近。

Update A
set IsDeleted = 1
from TableA A
join TableB B on b.ItemNumber = A.ItemNumber
where b.OrderNumber > 'XY004005'
and b.OrderNumber < 'XY500000'

【讨论】:

好的,所以我可以做一个 > 即使它是一个字符串?我想我需要在某个地方获取一个子字符串,并且可能将字符串转换为 int。但是 XY 确实在每个 OrderNumber 之前,所以也许这会起作用 当然。它只是将值排序为 varchar 而不是 ints。这带来了它自己的挑战,但对于您的情况,它应该可以正常工作。这与按姓氏排序人员的概念相同。我不得不问...如果每个订单都以“XY”开头,那有什么意义?为什么不删除它并将数据类型更改为 int。

以上是关于如何使用表 B 中的信息更新表 A 中的列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL UPDATE - 如何使用另一个表更新一个表中的列?

无法更新表中的列 它返回单行子查询返回多个

用数据更新了表“c”,此更新应再次更新表“a”和表“b”中的列

Oracle SQL - 重复行并更新表中的列

当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?

使用另一个表中的信息更新表中的列