我可以使用SQL从另一个表中用多个值更新多行吗?
我有一个一对多的表,为这些用户提供ID和特征。 我想将一个用户的设置复制到另一个用户我可以使用SQL从另一个表中用多个值更新多行吗?,sql,Sql,我有一个一对多的表,为这些用户提供ID和特征。 我想将一个用户的设置复制到另一个用户 userid trait onoff ------ ----- ----- 1 1 on 1 2 on 1 3 on 1 4 on 2 1 off 2 2 off 2
userid trait onoff
------ ----- -----
1 1 on
1 2 on
1 3 on
1 4 on
2 1 off
2 2 off
2 3 off
2 4 off
所以我想把onoff值从用户1复制到用户2,这样当我完成时,用户2就可以打开所有的东西
更新表集合onoff=从userid=1且userid=2的表中选择onoff
这是基本想法,但显然行不通。我想我希望服务器按照相关子查询的方式进行思考,但外部部分不是查询,而是更新
在一个步骤中就可以做到这一点吗?试试这个,userid=2将得到useid=1的值:
UPDATE u2
SET onoff=u1.onoff
FROM YourTable u2
INNER JOIN YourTable u1 ON u2.trait=u1.trait
WHERE u2.userid=2 AND u1.userid=1
完整的SQL Server 2005+示例:
DECLARE @YourTable table (userid int,trait int, onoff varchar(3))
INSERT INTO @YourTable VALUES (1, 1, 'on')
INSERT INTO @YourTable VALUES (1, 2, 'on')
INSERT INTO @YourTable VALUES (1, 3, 'on')
INSERT INTO @YourTable VALUES (1, 4, 'on')
INSERT INTO @YourTable VALUES (2, 1, 'off')
INSERT INTO @YourTable VALUES (2, 2, 'off')
INSERT INTO @YourTable VALUES (2, 3, 'off')
INSERT INTO @YourTable VALUES (2, 4, 'off')
select * from @YourTable order by userid,trait
UPDATE u2
SET onoff=u1.onoff
FROM @YourTable u2
INNER JOIN @YourTable u1 ON u2.trait=u1.trait
WHERE u2.userid=2 AND u1.userid=1
select * from @YourTable order by userid,trait
输出
userid trait onoff
----------- ----------- -----
1 1 on
1 2 on
1 3 on
1 4 on
2 1 off
2 2 off
2 3 off
2 4 off
(8 row(s) affected)
(4 row(s) affected)
userid trait onoff
----------- ----------- -----
1 1 on
1 2 on
1 3 on
1 4 on
2 1 on
2 2 on
2 3 on
2 4 on
(8 row(s) affected)
MERGE在SQL-99标准中引入,在SQL:2003中完善,并由多家供应商实施和扩展,如SQL Server 2008、Oracle、postgreSQL:
MERGE INTO YourTable
USING (
SELECT userid, trait, onoff
FROM YourTable
WHERE userid = 2
) AS S
ON YourTable.userid = 1
AND S.trait = YourTable.trait
WHEN MATCHED THEN
UPDATE
SET onoff = S.onoff
WHEN NOT MATCHED THEN
INSERT (userid, trait, onoff)
VALUES (userid, trait, onoff);
您使用的数据库/SQL引擎和版本是什么?其语法取决于您使用的SQL产品。这不是一个标准的SQL命令,但大多数引擎都支持扩展来实现这一点。@Larry Lustig,我不是SQL标准方面的专家,但您所需要的只是一个带有自连接的更新来解决这个问题,我认为大多数(如果不是全部)数据库都支持使用连接进行更新??请看我的答案,例如SQLite没有,Firebird没有。有些人这样做,有些人不这样做。而那些使用相同语法的人不一定使用相同的语法。