Oracle SQL: Update a table with data from another table

后端 未结 7 2148
广开言路
广开言路 2020-11-22 02:01

Table 1:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

Table 2:

id    na         


        
相关标签:
7条回答
  • 2020-11-22 02:11

    try

    UPDATE Table1 T1 SET
    T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
    T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
    WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);
    
    0 讨论(0)
  • 2020-11-22 02:12
    Update table set column = (select...)
    

    never worked for me since set only expects 1 value - SQL Error: ORA-01427: single-row subquery returns more than one row.

    here's the solution:

    BEGIN
    For i in (select id, name, desc from table1) 
    LOOP
    Update table2 set name = i.name, desc = i.desc where id = i.id;
    END LOOP;
    END;
    

    That's how exactly you run it on SQLDeveloper worksheet. They say it's slow but that's the only solution that worked for me on this case.

    0 讨论(0)
  • 2020-11-22 02:17
    BEGIN
    For i in (select id, name, desc from table2) 
    LOOP
    Update table1 set name = i.name, desc = i.desc where id = i.id and (name is null or desc is null);
    END LOOP;
    END;
    
    0 讨论(0)
  • 2020-11-22 02:23

    This is called a correlated update

    UPDATE table1 t1
       SET (name, desc) = (SELECT t2.name, t2.desc
                             FROM table2 t2
                            WHERE t1.id = t2.id)
     WHERE EXISTS (
        SELECT 1
          FROM table2 t2
         WHERE t1.id = t2.id )
    

    Assuming the join results in a key-preserved view, you could also

    UPDATE (SELECT t1.id, 
                   t1.name name1,
                   t1.desc desc1,
                   t2.name name2,
                   t2.desc desc2
              FROM table1 t1,
                   table2 t2
             WHERE t1.id = t2.id)
       SET name1 = name2,
           desc1 = desc2
    
    0 讨论(0)
  • 2020-11-22 02:31

    If your table t1 and it's backup t2 have many columns, here's a compact way to do it.

    In addition, my related problem was that only some of the columns were modified and many rows had no edits to these columns, so I wanted to leave those alone - basically restore a subset of columns from a backup of the entire table. If you want to just restore all rows, skip the where clause.

    Of course the simpler way would be to delete and insert as select, but in my case I needed a solution with just updates.

    The trick is that when you do select * from a pair of tables with duplicate column names, the 2nd one will get named _1. So here's what I came up with:

      update (
        select * from t1 join t2 on t2.id = t1.id
        where id in (
          select id from (
            select id, col1, col2, ... from t2
            minus select id, col1, col2, ... from t1
          )
        )
      ) set col1=col1_1, col2=col2_1, ...
    
    0 讨论(0)
  • 2020-11-22 02:34

    Try this:

    MERGE INTO table1 t1
    USING
    (
    -- For more complicated queries you can use WITH clause here
    SELECT * FROM table2
    )t2
    ON(t1.id = t2.id)
    WHEN MATCHED THEN UPDATE SET
    t1.name = t2.name,
    t1.desc = t2.desc;
    
    0 讨论(0)
提交回复
热议问题