如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据
Posted
技术标签:
【中文标题】如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据【英文标题】:How to update data in one table from corresponding data in another table in SQL Server 2005 【发布时间】:2011-02-07 10:50:47 【问题描述】:我在同一数据库服务器上的不同数据库中有两个表。
两个数据库的结构相同,但数据不同。 Database1 (Test1) 是最新的,database2 (Test2) 是数据库的旧副本。
Test1 有一个名为Employee
的表,其中包含 3000 条记录
Test2 有一个名为 Employee
的表,包含 1000 条记录
我需要从 Test2 中的同一个表中为名为 DeptID 的特定列更新 Test1 中的表,因为 Test2 数据库(旧的)中 Employee 表中的值已更新。所以我需要从大约 1000 行的旧数据库中的表中更新新数据库中的表。
换句话说,我需要使用Test2
中Employee
表中DeptID
列中的任何值更新Test1
DB 中Employee
表中的DeptID
列D B。
我知道我可以恢复数据库本身,但这不是解决方案。我需要从 Test2 数据库更新 Test1 数据库中的值。
【问题讨论】:
您只想更新两个表上的值吗?还是您希望这两个表相同? 很遗憾,您的问题并不清楚。我想你很难用英语清楚地表达你的问题,不要绝望!你可以举一些例子来帮助它。从每个表中发布大约 5-10 行,解释什么应该变成什么,这可能足以让我们了解您要完成的工作。 【参考方案1】:如果两个数据库在同一台服务器上,您应该能够创建类似这样的 SQL 语句:
UPDATE Test1.dbo.Employee
SET DeptID = emp2.DeptID
FROM Test2.dbo.Employee as 'emp2'
WHERE
Test1.dbo.Employee.EmployeeID = emp2.EmployeeID
从您的帖子中,我不太清楚您是想更新 Test1.dbo.Employee
使用来自Test2.dbo.Employee
的值(这就是我的查询所做的),还是相反(因为你提到Test1
上的数据库是新表......)
【讨论】:
优秀!!很简单,而且有效(除了我从 emp2 中删除了引号)。非常感谢! 正是我想要的。我在使用子查询之前已经这样做了,但我知道必须有一种更简单的方法。我只想补充一点,我只想根据另一个表中的相应值更新一个表中的记录子集,这可以通过向 WHERE 子句添加条件来轻松完成,例如WHERE Test1.dbo.Employee.EmployeeID = emp2.EmployeeID AND Test1.dbo.Employee.Department IN ('Sales','Marketing')
但是如果两个数据库在不同的服务器上我们会怎么做??【参考方案2】:
update t2
set t2.deptid = t1.deptid
from test1 t1, test2 t2
where t2.employeeid = t1.employeeid
【讨论】:
这里唯一的区别是这个版本使用了 t2 的别名。 这很好用。出于某种原因,@marc_s 的答案不起作用。可能是因为别名周围的引号?【参考方案3】:UPDATE table1
SET column1 = (SELECT expression1
FROM table2
WHERE conditions)
[WHERE conditions];
【讨论】:
【参考方案4】:update test1 t1, test2 t2
set t2.deptid = t1.deptid
where t2.employeeid = t1.employeeid
mysql不能使用from关键字
【讨论】:
【参考方案5】:试试这样的查询
INSERT INTO NEW_TABLENAME SELECT * FROM OLD_TABLENAME;
【讨论】:
问题陈述了不同的数据库。你没有考虑到这一点。加上答案已经有一个可以接受的答案。此外,请查看格式化您的查询。看看this。【参考方案6】:这很神奇 - 没有轮到使用 DataTable 调用此过程表单代码,其架构与 custType 完全匹配 创建表客户 ( id int identity(1,1) 主键, 名称 varchar(50), cnt varchar(10) )
create type custType as table
(
ctId int,
ctName varchar(20)
)
insert into customer values('y1', 'c1')
insert into customer values('y2', 'c2')
insert into customer values('y3', 'c3')
insert into customer values('y4', 'c4')
insert into customer values('y5', 'c5')
declare @ct as custType
insert @ct (ctid, ctName) values(3, 'y33'), (4, 'y44')
exec multiUpdate @ct
create Proc multiUpdate (@ct custType readonly) as begin
update customer set Name = t.ctName from @ct t where t.ctId = customer.id
end
public DataTable UpdateLevels(DataTable dt)
DataTable dtRet = new DataTable();
using (SqlConnection con = new SqlConnection(datalayer.bimCS))
SqlCommand command = new SqlCommand();
command.CommandText = "UpdateLevels";
command.Parameters.Clear();
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@ct", dt).SqlDbType = SqlDbType.Structured;
command.Connection = con;
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
dataAdapter.SelectCommand = command;
dataAdapter.Fill(dtRet);
【讨论】:
【参考方案7】: UPDATE Employee SET Empid=emp3.empid
FROM EMP_Employee AS emp3
WHERE Employee.Empid=emp3.empid
【讨论】:
【参考方案8】:使用测试1
insert into employee(deptid) select deptid from test2.dbo.employee
【讨论】:
问题不是插入新行而是用另一个现有表更新现有表。以上是关于如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 2005 中对 sql 表进行尴尬的旋转?
SQL Server 2005 - 以编程方式导出表(运行 .sql 文件来重建它)
根据表中另一个现有列的内容更改 SQL Server 中的现有列
SQL Server 2005 SSIS - 如何从文件的第一行获取特殊信息