Ваш код не швыряет ORA-00904, он швыряется без объяснений ORA-38104
SQL> MERGE INTO test T
USING (SELECT 'abc' AS group_company_id FROM DUAL) C
ON (T.group_company_id = C.group_company_id)
-- ON (1 = 1)
WHEN NOT MATCHED THEN
INSERT (create_date, group_company_id)
VALUES (TO_DATE('20100531', 'YYYYMMDD'), 'abc')
WHEN MATCHED THEN
UPDATE SET group_company_id = 'abc';
2 3 4 5 6 7 8 9 ON (T.group_company_id = C.group_company_id)
*
ERROR at line 3:
ORA-38104: Columns referenced in the ON Clause cannot be updated:
"T"."GROUP_COMPANY_ID"
SQL>
Я использую 11gR2 - возможно, поведение отличается в более раннем выпуске. В любом случае, решение довольно простое: не беспокойтесь о ветке MATCHED:
SQL> MERGE INTO test T
USING (SELECT 'abc' AS group_company_id FROM DUAL) C
ON (T.group_company_id = C.group_company_id)
-- ON (1 = 1)
WHEN NOT MATCHED THEN
INSERT (create_date, group_company_id)
VALUES (TO_DATE('20100531', 'YYYYMMDD'), 'abc')
2 3 4 5 6 7 8 /
0 rows merged.
SQL>
Этот синтаксис был недопустим, когда MERGE был представлен в 9i: нам пришлось включить обе ветви. Но это поддерживается с 10 г.
Если вы используете 9i и вам нужна ветвь MATCHED, вы должны обновить столбец, который не включен в предложение присоединения. Это будет CREATE_DATE в вашем примере,