So what are you going to do? we need to get your plans pinned down.

On Jun 17, 2009, at 11:46 AM, James Gregurich wrote:

>
> Dennis,
>
> question on an old post of yours below...
>
>
> on that update statement, is the SQL optimizer smart enough to not
> rerun that select statement for each column in the update's set
> clause? Is it going to run a single select statement to get <value1>,
> <value2>, etc.  or is it going to run one for each column in the
> update statement?
>
> -James
>
>> Petite Abeille wrote:
>>>
>>> How does one emulate a DML MERGE statement in SQLite [1]?
>>>
>>> INSERT OR REPLACE sounds promising but the REPLACE documentation
>> under
>>> the ON CONFLICT clause seems to imply that in the case of a
>> constraint
>>> violation the existing row will be deleted entirely and then
>> replaced
>>> by a brand new row instead of being merely updated [2].
>>>
>>> Apologies if this is a FAQ, but my google-fu is eluding me on this
>> one.
>>>
>>> Thanks in advance.
>>>
>>
>> I haven't tested this so take it with a grain of salt, but I think
>> this
>> should do the same thing as the merge statement.
>>
>> Given two tables, table1 and table2.
>>
>> merge into table1 using table2 on <condition>
>>     when matched then update
>>         set <column1> = <value1>,
>>             <column2> = <value2> ...
>>     when not matched then insert <columm1>, <column2> ...
>>         values (<value1>, <value2> ...)
>>
>> Should be the same as the following series of SQL statements.
>>
>> create temp table matches as
>>     select t1.rowid as row1, t2.rowid as row2
>>     from table1
>>     join table2
>>     where <condition>
>>
>> insert into table1 (<column1>, <column2> ...)
>>     select <value1>, <value2> ... from table2
>>     where rowid not in (select row2 from matches);
>>
>> update table1
>>     set <column1> = (select <value1> from table2
>>                     where table2.rowid =
>>                         (select row2 from matches
>>                         where row1 = rowid)),
>>         <column2> = (select <value2> from table2
>>                     where table2.rowid =
>>                         (select row2 from matches
>>                         where row1 = rowid))
>>         ...
>>     where rowid in (select row1 from matches);
>>
>> drop table matches;
>>
>>
>> HTH
>> Dennis Cote
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to