[ https://issues.apache.org/jira/browse/DERBY-3155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13870733#comment-13870733 ]
Dyre Tjeldvoll commented on DERBY-3155: --------------------------------------- I tried modifying Knut's singlerow view idea to use an ordinary table with a single row in it: {quote} String q = "MERGE INTO META USING SINGLEROW "+ "ON META.i = 42 "+ "WHEN MATCHED THEN UPDATE SET META.c = 'U' "+ "WHEN NOT MATCHED THEN INSERT (META.i, META.c) VALUES( 42, 'I' )"; {quote} That triggers the following exception {quote} Caused by: ERROR XSAI2: The conglomerate (0) requested does not exist. at org.apache.derby.iapi.error.StandardException.newException(StandardException.java:265) at org.apache.derby.iapi.error.StandardException.newException(StandardException.java:260) at org.apache.derby.impl.store.access.heap.HeapConglomerateFactory.readConglomerate(HeapConglomerateFactory.java:254) at org.apache.derby.impl.store.access.CacheableConglomerate.setIdentity(CacheableConglomerate.java:102) at org.apache.derby.impl.services.cache.ConcurrentCache.find(ConcurrentCache.java:295) at org.apache.derby.impl.store.access.RAMAccessManager.conglomCacheFind(RAMAccessManager.java:466) at org.apache.derby.impl.store.access.RAMTransaction.findConglomerate(RAMTransaction.java:404) at org.apache.derby.impl.store.access.RAMTransaction.findExistingConglomerate(RAMTransaction.java:383) at org.apache.derby.impl.store.access.RAMTransaction.openConglomerate(RAMTransaction.java:1289) at org.apache.derby.impl.sql.compile.ResultColumnList.newRowLocationTemplate(ResultColumnList.java:1641) at org.apache.derby.impl.sql.compile.ResultColumnList.buildRowTemplate(ResultColumnList.java:1563) at org.apache.derby.impl.sql.compile.IndexToBaseRowNode.generate(IndexToBaseRowNode.java:238) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1348) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1301) at org.apache.derby.impl.sql.compile.JoinNode.getJoinArguments(JoinNode.java:1648) at org.apache.derby.impl.sql.compile.JoinNode.generateCore(JoinNode.java:1624) at org.apache.derby.impl.sql.compile.JoinNode.generateCore(JoinNode.java:1561) at org.apache.derby.impl.sql.compile.HalfOuterJoinNode.generate(HalfOuterJoinNode.java:786) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1348) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1301) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1445) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1301) at org.apache.derby.impl.sql.compile.ScrollInsensitiveResultSetNode.generate(ScrollInsensitiveResultSetNode.java:86) at org.apache.derby.impl.sql.compile.CursorNode.generate(CursorNode.java:628) at org.apache.derby.impl.sql.compile.MergeNode.generate(MergeNode.java:759) at org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:317) at org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:547) at org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:99) at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:1116) at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:682) {quote} > Support for SQL:2003 MERGE statement > ------------------------------------ > > Key: DERBY-3155 > URL: https://issues.apache.org/jira/browse/DERBY-3155 > Project: Derby > Issue Type: Improvement > Components: SQL > Reporter: Trejkaz > Assignee: Rick Hillegas > Labels: derby_triage10_10 > Attachments: MergeStatement.html, MergeStatement.html, > MergeStatement.html, derby-3155-01-ac-grammar.diff, > derby-3155-02-ag-fixParserWarning.diff, > derby-3155-03-ae-backingStoreHashtableWithRowLocation.diff, > derby-3155-03-af-backingStoreHashtableWithRowLocation.diff, > derby-3155-03-ag-backingStoreHashtableWithRowLocation.diff, > derby-3155-03-ah-backingStoreHashtableWithRowLocation.diff, > derby-3155-04-ae-deleteAction.diff, derby-3155-04-af-deleteAction.diff, > derby-3155-05-aa-triggerTransitionTableAsTarget.diff, > derby-3155-06-aa-triggerTransitionTableAsSource.diff, > derby-3155-07-ad-insertAction.diff, derby-3155-08-ah-updateAction.diff, > derby-3155-09-aa-correlationNames.diff, > derby-3155-10-aa-correlationNames.diff, > derby-3155-11-ab-beforeTriggersCantFireMerge.diff > > > A relatively common piece of logic in a database application is to check for > a row's existence and then either update or insert depending on its existence. > SQL:2003 added a MERGE statement to perform this operation. It looks like > this: > MERGE INTO table_name USING table_name ON (condition) > WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...] > WHEN NOT MATCHED THEN INSERT column1 [, column2 ...] VALUES (value1 [, > value2 ...]) > At the moment, the only workaround for this would be to write a stored > procedure to do the same operation, or to implement the logic client-side. -- This message was sent by Atlassian JIRA (v6.1.5#6160)