Syntax for Merge statement to insert into target and update source

Hello All,
I want to use Merge statement to insert records when not matched in my target and update records in source when matched. Is it possible to do using Merge statement.
create table a (aa number)
create table b (bb number)
alter table a add flg char(1)
merge b as target
using a as source
on (target.bb = source.aa)
when matched then
update set source.flg = 'Y'
WHEN NOT MATCHED THEN
insert (target.bb)
values
(source.aa)
Thanks.

Hi,
I have no idea about the version of DB, else some new features with respect version can be specified - just for informaitve purpose and to post across the verison of DB in future posts.
Coming to your issue and requirement.
if you check the syntax and functionality , then its on Merge on target base only - with respect to Update (matched o columns) and insert (for unmatched columns). Source - as the term is clear. It might not work out on source table.
- Pavan Kumar N
- ORACLE OCP - 9i/10g
https://www.oracleinternals.blogspot.com

Similar Messages

  • MERGE statement without INSERT clause....is possible...?

    Hi everybody...
    MERGE statement without UPDATE or INSERT clause is possible or not
    I want to select from one table and update in another table. So i dont want insert statement and i want to do it in single query....possible solutions are requested.
    Thanks in advance
    pal

    Hi..
    Thanks for ur reply. For MERGE statement, we have to give UPDATE and INSERT clause. this MERGE statement works without INSERT or UPDATE clause.
    Why i am asking is, I want to select how many rows (count(*)) from table1 and based on this count, i have to update in table2
    Both tables r different and for select and for update where clauses are different. Both tables r totally different.
    I want to do it in single query, so i asked this is possible with MERGE statement without INSERT clause.
    Thanks for ur reply

  • SELECT * cannot be used in an INSERT INTO query when the source or destination table contains a multivalued field

    Hi,
    I am using Access 2013 and I have the following VBA code, 
    strSQL = "INSERT INTO Master SELECT * from Master WHERE ID = 1"
     DoCmd.RunSQL (strSQL)
    when the SQL statement is run, I got this error.
    SELECT * cannot be used in an INSERT INTO query when the source or destination table contains a multivalued field
    Any suggestion on how to get around this?
    Please advice and your help would be greatly appreciated!

    Rather than modelling the many-to-many relationship type by means of a multi-valued field, do so by the conventional means of modelling the relationship type by a table which resolves it into two one-to-many relationship types.  You give no indication
    of what is being modelled here, so let's assume a generic model where there is a many-to-many relationship type between Masters and Slaves, for which you'd have the following tables:
    Masters
    ....MasterID  (PK)
    ....Master
    Slaves
    ....SlaveID  (PK)
    ....Slave
    and to model the relationship type:
    SlaveMastership
    ....SlaveID  (FK)
    ....MasterID  (FK)
    The primary key of the last is a composite one of the two foreign keys SlaveID and MasterID.
    You appear to be trying to insert duplicates of a subset of rows from the same table.  With the above structure, to do this you would firstly have to insert rows into the referenced table Masters for all columns bar the key, which, presuming this to be
    an autonumber column, would be assigned new values automatically.  To map these new rows to the same rows in Slaves as the original subset you would then need to insert rows into SlaveMastership with the same SlaveID values as those in Slaves referenced
    by those rows in Slavemastership which referenced the keys of the original subset of rows from Masters, and the MasterID values of the rows inserted in the first insert operation.  This would require joins to be made between the original and the new subsets
    of rows in two instances of Masters on other columns which constitute a candidate key of Masters, so that the rows from SlaveMastership can be identified.
    You'll find examples of these sort of insert operations in DecomposerDemo.zip in my public databases folder at:
    https://onedrive.live.com/?cid=44CC60D7FEA42912&id=44CC60D7FEA42912!169
    If you have difficulty opening the link copy its text (NB, not the link location) and paste it into your browser's address bar.
    In this little demo file non-normalized data from Excel is decomposed into a set of normalized tables.  Unlike your situation this does not involve duplication of rows into the same table, but the methodology for the insertion of rows into a table which
    models a many-to-many relationship type is broadly the same.
    The fact that you have this requirement to duplicate a subset of rows into the same table, however, does make me wonder about the validity of the underlying logical model.  I think it would help us if you could describe in detail just what in real world
    terms is being modelled by this table, and the purpose of the insert operation which you are attempting.
    Ken Sheridan, Stafford, England

  • Retriving unique records and insert into cust and cust_det table

    Hi,
    uniq Table : EMP
    column name
    name
    addr
    city
    addr1
    city1
    EMP table contains only unique records.
    we neet to get the records from emp and insert into cust and cust_det accordingly
    table : cust
    empno : auto generated
    name
    addr
    tabel : cust_det
    empno : refer from cust
    addr1
    city1
    plese help me to do this.

    user10069916 wrote:
    can some one help me to resolve this plz. bit urgent..My boss says my work is more urgent than yours.
    As I said, please read: {message:id=9360002} (especially point 2)
    If you post sufficient information, then people can help you. the better the information you provide the faster people will be able to help... but still, if it's "urgent" then we can only assume you have a live production system that is failing, in which case you need to raise an SR with Oracle Support, as the forums are not the place for logging "urgent" production system issues.

  • My problem is very simple......firefox wont allow me save my downloads to any other location than my c drive....for example i have gone into options and set sav

    ''locking this thread as duplicate, please continue at [https://support.mozilla.org/en-US/questions/986549 /questions/986549]''
    my problem is very simple......firefox wont allow me save my downloads to any other location than my c drive....for example i have gone into options and set save downloads to my e drive....but still firefox keeps saving them to my c drive....i have 4 internal hard drives in my rig....and have tried saving downloads to them all.......why this is happening i cant understand....i have tried lots of suggestions....and have re-installed firefox multiple times

    hello, there's a general regression in firefox 27 that won't allow files to download directly into a root drive. please try to create a subfolder (like ''E:\Downloads'') and set this as default location for downloads...
    also see [https://bugzilla.mozilla.org/show_bug.cgi?id=958899 bug #958899].

  • I authorized a new computer for iTunes, plugged my phone into computer and now all of my songs in iTunes are not in my account and are missing from my phone.  Help!

    I authorized a new computer for iTunes, plugged my phone into computer and now all of my songs in iTunes are no longer in my account, on computer or in iphone  Help!

    Media is only where you put it.
    Did you copy or move the media from the old computer to the new computer?

  • Is there a software that will allow DVD video to put inserted into computer and uploaded into Mac iMovie?

    Is there a software that will allow DVD video to put inserted into computer and uploaded into iMovie on my MacBook Pro?

    Check out this user tip and see if it helps.
    https://discussions.apple.com/docs/DOC-3951

  • I purchased field runners for iPad, but after I backed up and updated to ios5, I could not find it

    I purchased field runners for iPad, but after I backed up and updated to ios5.01, I could not find it and when I went to the apps store, it shows that I have to purchase it.  What do I do?  Tks

    Contact iTunes
    http://www.apple.com/support/itunes/contact/

  • HT201270 hi i wanna ask if the update carrier update could affect if i insert another sim and update it..im using softbank but soon i will go back to philippines i wanna use philippine sim,is it possible ? than you

    hi i wanna ask if the update carrier update could affect if i insert another sim and update it..im using softbank but soon i will go back to philippines i wanna use philippine sim,is it possible ? than you

    Softbank does not offer unlocking at all. You can not use that phone with another carrier. Sell it before you leave and buy one you can use in the country where you intend to use it.

  • Looking for an insert statement to insert into a table around 500 rows

    Hi  Gurus,
    Your help is greatly appreciated !!,
    I need to have a query to insert into the mer_spec_feature table with the following , Please sugesst apart from the Utl_file ,input thing
    as the data is differnt in the regions and am lokking if it workes out with a insert and select query .
    1)I have to create a  script for inserting records into  mer_spec_feature where  on appl_id ‘VXRR’
    having feature ID 786 and have to Exclude TIDs which already have the 786 feature added for this appl_id like in the eblwo select query .
    2)There are 509 such TIDs where it doesnt have the 786 feature with appl_id -'VXRR' in the mer_spec_feature table
    3)
    select distinct terminal_id,  appl_id, from  mer_spec_feature
    where appl_id = 'VXRR'
    minus
    select distinct terminal_id, appl_id from mer_spec_feature
    where appl_id = 'VXRR'
    and terminal_feature_id = 786
    desc mer_spec_feature :
    Terminal_id  --varachr2(9)
    appl_id    --varcahr2(10 )
    terminal_feature-id --number(8)
    TERMINAL_FEATURE_ID
    TERMINAL_APPL_ID
    TERMINAL_ID
    299
    405T330a
    1004665
    786
    VXRR
    1004665

    @Frank Kulash !!
    Thanks always for your replys .!!
    i have tried with the above sql , and am having issue with the pk constraint after inserting  232 rows.
    And a Tertminal_id  will have 100 feature_id's for one  appl_id.
    becoz it has pk constraint on  -- TERMINAL_FEATURE_ID, APPL_ID, TERMINAL_ID
    TERMINAL_FEATURE_ID
    APPL_ID
    TERMINAL_ID
    299
    405T330a
    1004665
    786
    VXRR
    1004665
    can you please sugeest any other option.

  • Instead of trigger is NOT firing for merge statements in Oracle 10gR2

    The trigger fires fine for a update statement, but not when I use a merge statement
    with an update clause. Instead I get the normal error for the view ( which is a union all view, and therefore not updatable.)
    The error is :-
    ORA-01733: virtual column not allowed here
    oracle release is 10.2.0.2 for AIX 64L
    Is this a known bug ?
    I've used a multi-table insert statement to work around the problem for inserts, but
    for updates, I'd really like to be able to use a merge statement instead of an update.
    Mark.

    This is my cut-down version :-
    In this case case I'm getting an :-
    ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.
    rather then the ora-01733 error I get in the real code ( which is an update from an involved
    XML expression - cast to a table form)
    create table a ( a int primary key , b char(30) ) ;
    create table b ( a int primary key , b char(30) ) ;
    create view vw_a as
    select *
    from a
    union all
    select *
    from b ;
    ALTER VIEW vw_a ADD (
    PRIMARY KEY
    (a) DISABLE);
    DROP TRIGGER TRG_IO_U_ALL_AB;
    CREATE OR REPLACE trigger TRG_IO_U_ALL_AB
    instead of update ON vw_a
    for each row
    begin
    update a targ
    set b = :new.b
    where targ.a = :new.a
    if SQL%ROWCOUNT = 0
    then
         update b targ
         set b      = :new.b
         where targ.a = :new.a
    end if ;
    end ;
    insert into a values (1,'one');
    insert into a values (2,'two');
    insert into a values (3,'three');
    insert into b values (4,'quatre');
    insert into b values (5,'cinq');
    insert into b values (6,'six');
    commit;
    create table c as select a + 3 as a, b from a ;
    commit;
    merge into vw_a targ
    using (select * from c ) src
    on ( targ.a = src.a )
    when matched
    then update
    set targ.b = src. b
    select * from vw_a ;
    rollback ;
    update vw_a b
    set b = ( select c.b from c where b.a = c.a )
    where exists ( select c.b from c where b.a = c.a ) ;
    select * from vw_a ;
    rollback ;

  • Help for merge statement?

    I have a problem in Merge statement. My merge statement is following:
    MERGE INTO hoadon hd
    USING (
    SELECT m.ma_ttoan, t.ma_ttoan ma_kh
    FROM tai_anhxa_makh t
    INNER JOIN hoadon m on t.ma_kh = m.ma_ttoan
    WHERE m.thang_nam = '200908' and m.ma_ttoan not like 'DLC%' and t.ma_ttoan IS NOT NULL
    GROUP BY m.ma_ttoan, t.ma_ttoan
    ) m ON (hd.ma_ttoan = m.ma_kh)
    WHEN MATCHED THEN
    UPDATE SET ma_ttoan = m.ma_ttoan
    WHEN NOT MATCHED THEN
    INSERT (thang_nam, ma_ttoan) VALUES('200908','thaodv')
    After execute this query, PS/SQL show error message: "ORA-00904: hd.ma_ttoan invalid identifier"
    I'm using Oracle version 9i
    Can anyone help me to resolve this problem?
    Thanks in advance

    In 9i you can't use the columns from the ON clause in your UPDATE part of the MERGE statement
    this is invalid:
    UPDATE SET ma_ttoan = m.ma_ttoanuse a different column here.

  • Select statement to insert into a table using a loop

    hi
    create table uploadtab(
    itema varchar2(3),
    xtype varchar2(1),
    salesa number,
    margina number,
    salesb number,
    marginb number,
    salesc number,
    marginc number);
    insert into uploadtab
      (itema, xtype, salesa, margina, salesb, marginb, salesc, marginc)
    values
      ('abc', 'a', 100, .40, 300, .10, 450, .25);
    create table testinsert(itema varchar2(3),
    xtype varchar2(1),
    sales number,
    margin number);what i want to do is create 3 records based on that one in a loop
    so my desired output for testinsert is as follows
    abc  a 100  .40
    abc  a 300  .10
    abc  a 450  .25i don't want to use 3 insert tables if at all possible
    any help would be greatly appreciated
    thanks in advance
    Edited by: DM on Jul 7, 2010 2:22 PM

    Just a question on this
    INSERT INTO testinsert
    ( itema
    , xtype
    , sales
    , margin
    SELECT  itema
    ,       xtype
    ,       DECODE
            ( RN
            , 1,salesa
            , 2,salesb
            , 3,salesc
    ,       DECODE
            ( RN
            , 1,margina
            , 2,marginb
            , 3,marginc
    FROM            uploadtab
    CROSS JOIN      (
                            SELECT ROWNUM RN
                            FROM   dual
                            CONNECT BY LEVEL <= 3
    ;when you put a WHERE before the CROSS JOIN, the error
    ORA-00933:SQL command not properly ended. is displayed.

  • Need Help for MERGE statement

    I have a MERGE statement, I am executing it from shell script, I want to print that how many rows has been updated and Inserted.
    Can any one give me some idea.
    Thanks in Advance

    I want to print that how many rows has been updated and Inserted. If you really want/need to print that information, then don't use MERGE but INSERT and UPDATE statements.
    http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:35615502072484
    http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:122741200346595110

  • Popup not INSERTing into table and not refreshing called page ...

    Greetings
    Environment: APEX 3.1.1.00.09 on AIX 5.3 in 10gR2
    I have read many of the threads concerning my issue and I feel I am getting close to the answer but somehow have combined too many of the suggestions and am tripping over my own code.
    Please look at my sample application on apex.oracle.com:
    Workspace: galway
    User: gwicke
    Password: gwicke
    Please start with Page3, select any Agency and then click 'Add New Contract'.
    There is currently a <strong>BOLD </strong>label 'Add New Builder' that is a link that should open a popup window. Type any name into the field and click 'Create Builder'. This should INSERT the row into the builder table, close the popup, assign the new builder name to the calling page item 'Builder Name' and populate the screen item.
    In it's current state, the application will open the popup window, allow entry and close upon clicking the 'Create Builder' button. However the new builder is NOT inserted into the table and the calling page item is not populated.
    By looking at the Page Items and Session State I can see the correct values assigned to the 'Pn_BULDER_NAME' items on both the popup page (4) and the calling page (2) but the value does not appear on the screen.
    I've read where there's really two parallel universes, no sorry, two versions of the screen items, one in Session State and one that is displayed in the browser and there are steps to take to be sure the one displayed is updated from Session State as I would like in this case.
    I've entered Javascript code in the Page4 - header to define the 'passBack2()' function and code in the 'Optional URL Redirect' section of the 'Add Builder' button to hopefully execute the ARP for the INSERT, assign the Page2 items and close the popup. It doesn't quite get all that done.
    Any helpp is greatly appreciated. Thanks to Denes for most of the code suggestions I've followed.
    -gary

    Hi Gary,
    I think that there's a very simple solution to this - didn't really spot it last night.
    Firstly, yes, you could use a "button" to handle the call for the popup - just make sure that the button is a URL type "button" that is actually an A tag with the call in the URL target setting. Alternatively, you could take you existing A tag and use the same class attribute for one of your buttons as this should make it look like a button.
    More importantly, though, I think that we could do it as:
    1 - On your page 2 popup call, clear that cache for page 4 (the popup page) - I have already done this in your app by updating the url
    2 - On the popup page, allow the user to enter in their desired P4_BUILDER_NAME value (not sure if you want to do something to make this unique?)
    3 - Let the user click the Create button on the popup. This will submit the page, which will get your P4_BUILDER_RANK (the pk) value and insert a new record into the table (you could consider creating a sequence and a trigger to handle the creation of a new PK value?).
    4 - Assuming the P4_BUILDER_RANK then exists (it wouldn't if there was an error somewhere), then conditionally display a region that had a piece of javascript that submits page 2 and then closes itself - we don't need to pass anything back to page 2 (see below)
    5 - As the P4_BUILDER_NAME and P4_BUILDER_RANK exist in the session, when page 2 is being reloaded, (A) the select list would be updated with the new Builder (still not sure why all my entries appeared at the bottom instead of in alpha order??) and (B) both P2_BUILDER_NAME and P2_BUILDER_RANK can have Post Calculation Computations set (NVL(:P4_BUILDER_NAME,:P2_BUILDER_NAME) and NVL(:P4_BUILDER_RANK, :P2_BUILDER_RANK) respectively) - the effect of this is, if there are values stored in the P4 page items, we use them, otherwise we use whatever values were in the P2 page items
    6 - Finally, to stop (5) happening in all page 2 loads, you would need to clear the cache for page 4 in as many places as possible - eg, branches to page 2 or buttons on page 2
    The reason we can't pass values back to page 2 is that one of the items is a select list. The value we want to select won't appear on the select list until the page has been submitted. So, we can't set the value and submit because the value isn't there. We can't submit and set the value because javascript wouldn't know when the page has been updated (or, at least, you would have to put some independant mechanism in place to identify this, which may become complicated).
    So, simply put, as long as we know that if the values are in the session, we can use Post Calculation Computations to set our fields to these values. The only thing to bear in mind is that we need to ensure that these session values only exist when we need them - hence clearing the cache. This principle should work for any type of field - but, as you have no doubt seen, simple text fields can be updated by the popup directly as the field should accept any value we give it.
    My only other recommendation would be to completely remove the MRU processes from the page as these are not required (they just confuse the issue) and you could make your PK fetch and record insert into a single process - just to keep things neat and tidy, you understand!
    When I finished with your app last night, I did leave it so that javascript would create a new option on the select list and then set the value. But the above methodology seems to be a lot simpler.
    Andy

Maybe you are looking for