Das Problem scheint irgendwie damit zusammenzuhängen, dass bei dem inneren Select (teilweise) eine leer Menge heraus gekommen ist. Wenn ich das MERGE nun so gestalte, dass immer mindestens ein Datensatz in dieser Menge steckt, so funktioniert es.
// edit...
Oracle ist ja mal so eine
drecks tolle (*hust*) Datenbank. Das hier geht:
SQL-Code:
MERGE INTO "TdmUser" D
USING (
SELECT *
FROM "TdmUser"
WHERE "UserID" = 70
OR "UserID" = -1) S
ON (D."UserID" = S."UserID" AND D."UserID" <> -1)
WHEN MATCHED THEN
UPDATE SET D."Username" = 'update'
WHEN NOT MATCHED THEN
INSERT (D."Username", D."Disabled")
VALUES ('inserta', 0);
Und das hier nicht:
SQL-Code:
MERGE INTO "TdmUser" D
USING (
SELECT *
FROM "TdmUser"
WHERE "Username" = 'test'
OR "UserID" = -1) S
ON (D."Username" = S."Username" AND D."UserID" <> -1)
WHEN MATCHED THEN
UPDATE SET D."Username" = 'update'
WHEN NOT MATCHED THEN
INSERT (D."Username", D."Disabled")
VALUES ('inserta', 0);
Tja, und jetzt wird es sehr interessant: wo liegt der Unterschied?! Lediglich darin, dass das eine (UserID) ein NUMBER und das andere (Username) ein VARCHAR2-Feld ist. WTF?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)