SQL UPDATE - 如何使用另一个表更新一个表中的列?
Posted
技术标签:
【中文标题】SQL UPDATE - 如何使用另一个表更新一个表中的列?【英文标题】:SQL UPDATE - How to update a column from one table using another table? 【发布时间】:2020-08-07 14:47:30 【问题描述】:我会尽力解释这一点,如果这没有意义,我会提前道歉。我有来自一个表(Table.a)的两列(First_Name 和 Last_Name),其中很多数据不正确。我正在尝试使用另一个表(Table.b)中的正确数据更新这些列。问题是 table.b 的列在一个列中包含名字和姓氏数据。例如,table.a 的列和值是 First_Name = Richard 和 Last_Name = Johnsondev,而 table.b 的列和值是 Full_Name = Johnsondev, Richard。有没有办法使用部分 table.b 数据更新 table.a 两列?唯一一致的是 table.b 的姓以“dev”结尾,例如“Johnsondev, Richard”
编辑:
我正在使用 Microsoft SQL Server。希望以下信息对您有所帮助!
当前表格数据
表.B
FULL_NAME
Johnsondev, Richard
Smithdev, Kevin
表.A
FIRST_NAME / LAST_NAME
Richard / Jacksondev
Kevin / Standev
使用查询的预期输出
TABLE.B stays the same
TABLE.A
FIRST_NAME / LAST_NAME
Richard / Johnsondev
Kevin / Smithdev
【问题讨论】:
能否请您在here 中提供一些示例数据或添加预期输出的问题? 嗨詹姆斯。有几件事:您已经标记了 mysql 和 sql-server(这是 Microsoft)。语法和答案可能会有所不同,具体取决于您实际使用的 sql 版本。您能否提供更多关于表 b 的示例?粘贴多行数据,并告知您已经尝试过的内容。您的查询确实有意义。您基本上是在尝试拆分该列,但我们需要查看数据的外观,并建议您使用什么版本的 SQL 来提供准确的答案。干杯 啊抱歉,我还是 sql 新手,你可以告诉大声笑。我刚刚对我的帖子进行了编辑 在 PostgreSQL 上你可以使用this。 在 PostgreSQL 上,你可以使用this。 【参考方案1】:如果您在 tlk27 的回答中使用 JOIN
方法,这将是 SQL Server 的语法:
UPDATE a SET FIRST_NAME=SUBSTRING(b.FULL_NAME, CHARINDEX(',',b.FULL_NAME) +1, Len(b.FULL_NAME)),
LAST_NAME=LEFT(b.FULL_NAME, CHARINDEX(',',b.FULL_NAME)-1)
FROM Table_A a JOIN Table_B b ON a.ID = b.ID -- assumes a common ID field
【讨论】:
非常感谢,这很有帮助!我刚刚从这个查询中学到了新东西! @James 不客气!如果适合您的需要,请将其标记为答案。 有没有一种可能的方法来使用您提供的相同查询并使用它来查找有多少问题?我尝试使用您提供的查询作为 SELECT 语句,但我遇到了错误。 什么意思?您是否希望SELECT
返回两个表中名称不同的行?
SELECT COUNT(*) AS NotEqual FROM Table_A a JOIN Table_B b ON a.ID=b.ID WHERE b.FULL_NAME<>a.LAST_NAME + ',' + a.FIRST_NAME;
【参考方案2】:
在 MySQL 中,您可以执行以下操作。根据您的设置,这可能需要修改。但是,对于LAST_NAME
,我们将选择指定分隔符','
之前的所有内容。对于FIRST_NAME
,我们选择了我们用来获取姓氏的右侧的所有内容。请注意,这将更新所有名称。你可以在`
WHERE
UPDATE Table_A a
SET a.FIRST_NAME = (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(FULL_NAME, ',', 2), ' ', -1)
FROM TABLE_B),
a.LAST_NAME = (SELECT SUBSTRING_INDEX('Johnsondev, Richard', ',', 1)
FROM TABLE_B),
或者,您可能需要将它们连接在一起。
UPDATE Table_A a
JOIN Table_B b ON b.ID = a.ID -- assumes a common ID field
SET a.FIRST_NAME = (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(FULL_NAME, ',', 2), ' ', -1)
FROM TABLE_B),
a.LAST_NAME = (SELECT SUBSTRING_INDEX('Johnsondev, Richard', ',', 1)
FROM TABLE_B),
编辑 根据您的要求,经过一些测试后,看起来这些可能是 SQL Server 中的替代方案。
SUBSTRING:SUBSTRING ( expression ,start , length )
CHARINDEX:CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
SELECT SUBSTRING('Johnsondev, Richard', CHARINDEX(',','Johnsondev, Richard') +1, Len('Johnsondev, Richard')) -- Richard
SELECT LEFT('Johnsondev, Richard',CHARINDEX(',','Johnsondev, Richard')-1) -- Johnsondev
使用你的变量:
SELECT SUBSTRING(FULL_NAME, CHARINDEX(',',FULL_NAME) +1, Len(FULL_NAME))
FROM TABLE_B
SELECT LEFT(FULL_NAME, CHARINDEX(',',FULL_NAME)-1)
FROM TABLE_B
我对@987654334@ 的SQL Server 语法不太熟悉,但您可以找到here。
【讨论】:
SQL Server 有 SUBSTRING_INDEX 的替代品吗?以上是关于SQL UPDATE - 如何使用另一个表更新一个表中的列?的主要内容,如果未能解决你的问题,请参考以下文章