将数据从一列复制到另一列(在另一张表中)


89

我想将数据从另一表的一列复制到另一表的另一列。我怎样才能做到这一点?

我尝试了以下方法:

Update tblindiantime Set CountryName =(Select contacts.BusinessCountry From contacts) 

但它没有用。

我要将联系人表的“ BusinessCountry”列复制到tblindiantime表的“ CountryName”列。


1
要将列从一个表复制到另一个表,需要在表之间建立某种关系。这两个表是否具有公共ID?
mdma,2010年

1
您正在使用哪个数据库和版本?
Mark Byers

Answers:


88

在SQL Server 2008中,您可以使用多表更新,如下所示:

UPDATE tblindiantime 
SET tblindiantime.CountryName = contacts.BusinessCountry
FROM tblindiantime 
JOIN contacts
ON -- join condition here

您需要一个连接条件来指定应更新的行。

如果目标表当前为空,则应改用INSERT:

INSERT INTO tblindiantime (CountryName)
SELECT BusinessCountry FROM contacts

1
谢谢,谢谢您的回复,但它向我显示以下错误无法将NULL值插入表'tqms.dbo.tblindiantime'的'IndianTime'列中;列不允许为空。INSERT失败。该语句已终止。
阿米特·帕蒂尔

2
@AmitPatil-我知道这很旧,但可能会帮助像您这样的人。使用ISNULL(contacts.BusinessCountry,'')而不是contact.BusinessCountry,它应该可以解决您的问题。我们基本上是用空字符串替换null。
Ankur-m 2012年

1
因为此示例未显示“连接条件”可能是什么,所以也请参阅Michael Pakhantsov的答案,cedrikdlb的答案以及Parveen的类似问题的答案,其中必须将两列进行比较以选择正确的行
ToolmakerSteve

152

这里查询:

相同表:

UPDATE table_name 
SET column1 = column2

不同的表:

UPDATE table_name1 
    SET column1 = (
        SELECT column2
        FROM table_name2
        WHERE table_name1.id = table_name2.id
    );

13
在问题的上下文中是错误的,问者特别涉及2个表。
bPratik 2013年

2
如果列与同一个表相关,则它适用于mysql。
Satish Pandey

11
但是,这确实解决了我的问题,并且我通过问题标题到达此处,该标题可能与该答案的匹配程度大于与问题中的细节的匹配程度!
罗伯·格兰特

6
该答案回答问题的标题,而不是问题本身。不过,我发现这对于我想做的事情很有用。
Wizard07KSU 2015年

1
这是一个很好的答案;它帮助我仅将备份中的一列复制到主表中!
Zelter Ady

22

Table2.Column2 => Table1.Column1

我知道这个问题很旧,但是可接受的答案对我没有用。对于未来的Google员工,这对我有用:

UPDATE table1 
    SET column1 = (
        SELECT column2
        FROM table2
        WHERE table2.id = table1.id
    );

从而:

  • table1 =具有需要更新的列的表
  • table2 =具有包含数据列的表
  • column1 =需要来自column2的数据的空白列(在表1中)
  • column2 =包含数据的列(在table2中)

1
为我工作-但同上答案[Michael Pakhantsov]
唐·钱德尔

3
您是对的,@ mmcra,它现在与上面的答案相同。但是,在我撰写此评论时并不相同。您会注意到它在9月进行了编辑,并且错误已得到修复。我在6月写了此评论。
肯尼·格雷奇

16

希望您有两个关键字段。

 UPDATE tblindiantime t
   SET CountryName = (SELECT c.BusinessCountry 
                     FROM contacts c WHERE c.Key = t.Key 
                     )

1
仅当您将一个字段替换为另一个字段时,此方法才有效。如果ORA-01427: single-row subquery returns more than one rowselect返回多于一行,它将抛出该字段;如果我想选择多于一行,并使用这些值更新该列,该怎么办?
穆罕默德·拉马希

3
@Muhammad Ramahy,您是否在更新列中嵌套了表格?在子查询中返回几行,则Key不是联系人表的PrimaryKey。如果您有复合主键,则只需要WHERE子句的条件。
Michael Pakhantsov

1
我不明白您的意思是“希望您的关键字段是两个表”
Marco Lackovic

2
@Krige-他显然表示“如果两个表具有共享的Key字段,以标识每个表的哪一行与其他表的行匹配”。如果不这样做,则需要更改之后的内容WHERE。例如,如果tblindiantime有场ContactID,这是ID该行的contacts其中与tblindiantime各行所属,那么你可以使用WHERE tblindiantime.ContactID=contacts.ID。有关其他变化,请参见cedrikdlb的答案
ToolmakerSteve

8

一个类似问题的答案对我来说比该问题选择的答案(马克·拜尔斯(Mark Byers))更正确。使用Mark的答案,我的更新的列在所有行中的值都相同(也许与匹配连接的第一行中的值相同)。使用来自另一个线程的ParveenaArora的答案将列更新为正确的值。

转换Parveena的解决方案以使用此问题的表和列名,查询将如下(其中我假设表通过tblindiantime.contact_id关联):

UPDATE tblindiantime
SET CountryName = contacts.BusinessCountry
FROM contacts
WHERE tblindiantime.contact_id = contacts.id;

3

我认为以前的所有答案都是正确的,下面的这段代码非常有效,特别是如果您必须一次更新多行,请注意:这是PL / SQL

DECLARE
    CURSOR myCursor IS 
      Select contacts.BusinessCountry 
      From contacts c WHERE c.Key = t.Key;
    ---------------------------------------------------------------------
BEGIN
    FOR resultValue IN myCursor LOOP
        Update tblindiantime t
        Set CountryName=resultValue.BusinessCountry 
        where t.key=resultValue.key;
    END LOOP;
END;

我希望这会有所帮助。


2

现在,使用Management Studio 2016更加容易。

使用SQL Server Management Studio

将数据从一个表复制到另一个表

1.右键单击表,然后单击“设计”,打开包含要复制的列和要复制到的列的表。

2.单击表的选项卡,其中包含要复制的列,然后选择这些列。

3.从“编辑”菜单中,单击“复制”

4.打开一个新的查询编辑器窗口。

5.右键单击“查询编辑器”,然后单击“在编辑器中设计查询”

6.在“添加表”对话框中,选择源表和目标表,单击“添加”,然后关闭“添加表”对话框。

7.右键单击查询编辑器的空白区域,指向“更改类型”,然后单击“插入结果”

8.在“选择插入结果的目标表”对话框中,选择目标表。

9.在查询设计器的上部,单击源表中的源列。

10.查询设计器现在已创建一个INSERT查询。单击“确定”将查询放入原始“查询编辑器”窗口。

11.执行查询以将数据从源表插入到目标表。

有关更多信息https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/copy-columns-from-one-table-to-another-database-engine


1

可以通过使用不同的属性来解决。

  • 使用单元格控件的单击事件。
  • 选择要转置到另一个列的列值。
  • 将所选的值发送到另一个文本框或级别(随便填写),以及一个辅助按钮来修改所选的属性。
  • 更新数据库的整个堆栈,并使用sql查询创建一种算法来克服这一问题,从而将其转置到另一列中。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.