首页 文章

如何在SQL中使用JOIN执行UPDATE语句?

提问于
浏览
1096

我需要使用'parent'表中的数据更新 SQL Server 2005 中的此表,如下所示:

sale

id (int)
udid (int)
assid (int)

ud

id  (int)
assid  (int)

sale.assid 包含更新 ud.assid 的正确值 .

什么查询会这样做?我在考虑 join 但我可能会这么做 .

15 回答

  • 2

    Teradata Aster提供了另一种有趣的方法来实现目标:

    MERGE INTO ud --what trable should be updated
    USING sale -- from what table/relation update info should be taken
    ON ud.id = sale.udid --join condition
    WHEN MATCHED THEN 
        UPDATE SET ud.assid = sale.assid; -- how to update
    
  • 122

    使用FROM关键字的以下语句用于使用连接更新多个行

    UPDATE users 
    set users.DivisionId=divisions.DivisionId
    from divisions join users on divisions.Name=users.Division
    
  • 7

    标准的SQL方法是

    UPDATE ud
    SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
    

    在SQL Server上,您可以使用连接

    UPDATE ud
    SET assid = s.assid
    FROM ud u
    JOIN sale s ON u.id=s.id
    
  • 20

    另一个例子为什么SQL不是真正可移植的 .

    对于MySQL,它将是:

    update ud, sale
    set ud.assid = sale.assid
    where sale.udid = ud.id;
    

    有关更多信息,请阅读多表更新:http://dev.mysql.com/doc/refman/5.0/en/update.html

    UPDATE [LOW_PRIORITY] [IGNORE] table_references
        SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
        [WHERE where_condition]
    
  • 5

    这应该在SQL Server中工作:

    update ud 
    set assid = sale.assid
    from sale
    where sale.udid = id
    
  • 87

    MySQL

    如果忘记where子句并将所有条件放在ON表达式中,您将获得最佳性能 .

    我认为这是因为查询首先要加入表然后运行where子句,所以如果你可以减少加入所需的内容那么这就是获得结果的快捷方式/做udpate .

    示例

    场景

    你有一个用户表 . 他们可以使用他们的用户名或电子邮件或account_number登录 . 这些帐户可以是活动的(1)或非活动的(0) . 该表有50000行

    然后,您有一个用户表可以一次性禁用,因为您发现他们都做了坏事 . 但是,此表有一列包含用户名,电子邮件和帐号 . 它还有一个“has_run”指示符,当它运行时需要设置为1(真)

    查询

    UPDATE users User
        INNER JOIN
            blacklist_users BlacklistUser
            ON
            (
                User.username = BlacklistUser.account_ref
                OR
                User.email = BlacklistedUser.account_ref
                OR
                User.phone_number = BlacklistUser.account_ref
                AND
                User.is_active = 1
                AND
                BlacklistUser.has_run = 0
            )
        SET
            User.is_active = 0,
            BlacklistUser.has_run = 1;
    

    推理

    如果我们必须只加入OR条件,它基本上需要检查每一行4次以查看它是否应该加入,并可能返回更多行 . 但是,通过给它更多的条件,如果它们在加入时不满足所有条件,它可以“跳过”很多行 .

    奖金

    它更具可读性 . 所有条件都在一个地方,要更新的行在一个地方

  • 12

    语法严格依赖于您使用除MySQL,SQL Server或Oracle之外的SQL DBMS的SQL DBMS,那么它可能是唯一的方法(例如,如果您的SQL DBMS不支持 MERGE ):

    ANSI / ISO:

    update ud 
         set assid = (
              select sale.assid 
              from sale 
              where sale.udid = ud.id
         )
     where exists (
          select * 
          from sale 
          where sale.udid = ud.id
     );
    

    MySQL的:

    update ud u
    inner join sale s on
        u.id = s.udid
    set u.assid = s.assid
    

    SQL Server:

    update u
    set u.assid = s.assid
    from ud u
        inner join sale s on
            u.id = s.udid
    

    甲骨文:

    update
        (select
            u.assid as new_assid,
            s.assid as old_assid
        from ud u
            inner join sale s on
                u.id = s.udid) up
    set up.new_assid = up.old_assid
    

    SQLite的:

    update ud 
         set assid = (
              select sale.assid 
              from sale 
              where sale.udid = ud.id
         )
     where RowID in (
          select RowID 
          from ud 
          where sale.udid = ud.id
     );
    
  • 32

    我认为顶级帖子中的SQL-Server可以用于Sybase,因为它们都是T-SQL,但遗憾的是没有 .

    对于Sybase,我发现更新需要在表本身而不是别名:

    update ud
    set u.assid = s.assid
    from ud u
        inner join sale s on
            u.id = s.udid
    
  • 2

    尝试这个,我认为这对你有用

    update ud
    
    set ud.assid = sale.assid
    
    from ud 
    
    Inner join sale on ud.id = sale.udid
    
    where sale.udid is not null
    
  • 7

    使用 JOIN -ing多个表简化更新查询 .

    UPDATE
            first_table ft
            JOIN second_table st ON st.some_id = ft.some_id
            JOIN third_table tt  ON tt.some_id = st.some_id
            .....
        SET
            ft.some_column = some_value
        WHERE ft.some_column = 123456 AND st.some_column = 123456
    

    Note - first_table,second_table,third_table和some_column(如123456)是演示表名,列名和ID . 用有效名称替换它们 .

  • 3

    对于SQLite,使用RowID属性进行更新:

    update Table set column = 'NewValue'
    where RowID = 
    (select t1.RowID from Table t1
    join Table2 t2 on t1.JoinField = t2.JoinField
    where t2.SelectValue = 'FooMyBarPlease');
    
  • 2032

    在MS ACCESS中:

    UPDATE ud 
    INNER JOIN sale ON ud.id = sale.udid
    SET ud.assid = sale.assid;
    
  • 1

    Postgres的

    UPDATE table1
    SET    COLUMN = value
    FROM   table2,
           table3
    WHERE  table1.column_id = table2.id
           AND table1.column_id = table3.id
           AND table1.COLUMN = value
           AND table2.COLUMN = value
           AND table3.COLUMN = value
    
  • 0

    PostgreSQL

    CREATE TABLE ud (id integer, assid integer);
    CREATE TABLE sales (id integer, udid integer, assid integer);
    
    UPDATE ud
    SET assid = sales.assid
    FROM sales
    WHERE sales.id = ud.id;
    
  • 40
    UPDATE tblAppraisalBasicData
    SET tblAppraisalBasicData.ISCbo=1
    FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
    

相关问题