Update statement to update multiple rows

后端 未结 4 1315
盖世英雄少女心
盖世英雄少女心 2021-01-30 13:38

I have a question regarding the following syntax. Is there a cleaner way to roll this up into one statement rather than two. I\'ve tried several iterations but this seems to b

相关标签:
4条回答
  • 2021-01-30 14:06

    I am looking for a less newbie way

    Doing two separate update statements is (according to me) "the less newbie way" you could complicate stuff and do something like this.

    update employee
    set hire_date = case emp_id
                      when 'PMA42628M' then '1979-03-15'
                      when 'PSA89086M' then '1988-12-22'
                    end
    where emp_id in ('PMA42628M', 'PSA89086M')
    

    but what would that gain you? The entire update would run in one implicit transaction so if you want your two updates to be in a transaction you just use begin transaction .... commit.

    0 讨论(0)
  • 2021-01-30 14:12

    Try this one, this will combine multiple selects and returns them as if they come from the DB:

    UPDATE e
    SET hire_date = t.hire_date
    FROM dbo.employee e
    JOIN (
        SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15'
        UNION ALL
        SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22'
    ) t ON t.emp_id = e.emp_id
    

    If you are using SQL Server 2008 or later version, you could also use a different syntax for the derived table:

    UPDATE e
    SET hire_date = t.hire_date
    FROM dbo.employee e
    JOIN (
        VALUES
            ('PMA42628M', '1979-03-15'),
            ('PSA89086M', '1988-12-22')
    ) t (emp_id, hire_date) ON t.emp_id = e.emp_id
    
    0 讨论(0)
  • 2021-01-30 14:18

    You can make a temporary table or a table variable containing the updates you want to do, then run the UPDATE statement linking the table to the table you intend to update.

    Note that for two updates, you get two statements: the INSERT into the update table and the UPDATE statement itself. The number of statements remains two though for as many updates you need to do.

    CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL);
    INSERT INTO #employee (emp_id,hire_date)
    VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05');
    
    CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL);
    INSERT INTO #target_updates (emp_id,hire_date)
    VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22');
    
    UPDATE
        #employee
    SET
        hire_date=tu.hire_date
    FROM
        #employee AS e
        INNER JOIN #target_updates AS tu ON
            tu.emp_id=e.emp_id;
    
    SELECT
        *
    FROM
        #employee
    ORDER BY
        emp_id;
    
    DROP TABLE #target_updates;
    DROP TABLE #employee;
    
    0 讨论(0)
  • 2021-01-30 14:19

    update table_name set='value' where orgid in (idnum1, idnum2)

    0 讨论(0)
提交回复
热议问题