Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用SQL从另一个表中用多个值更新多行吗?_Sql - Fatal编程技术网

我可以使用SQL从另一个表中用多个值更新多行吗?

我可以使用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

我有一个一对多的表,为这些用户提供ID和特征。 我想将一个用户的设置复制到另一个用户

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没有。有些人这样做,有些人不这样做。而那些使用相同语法的人不一定使用相同的语法。