我正在尝试向表中插入一些条目,并且在该条目已经存在时不执行任何操作。我的主键包含多个列(event_timestamp,device_id,path,message_id)。
当我尝试类似JDBC中的以下语句时:
MERGE INTO events dest
USING ( SELECT event_timestamp, device_id, path, message_id from events) src
ON (dest.event_timestamp = src.event_timestamp
and dest.device_id = src.device_id
and dest.path = src.path
and dest.message_id = src.message_id)
WHEN NOT MATCHED THEN
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
什么也没插入。
使用普通语句:
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
所有内容均插入无问题。
我还尝试更改select语句以从DUAL
中进行选择,而不是像这样的事件:
MERGE INTO events dest
"USING ( SELECT event_timestamp, device_id, path, message_id from DUAL) src
ON (dest.event_timestamp = src.event_timestamp
and dest.device_id = src.device_id
and dest.path = src.path
and dest.message_id = src.message_id)
WHEN NOT MATCHED THEN
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
但随后我得到了例外:ORA-00904: invalid identifier
我该怎么做才能使其正常工作?
答案 0 :(得分:3)
您要传递的新值应该是SELECT FROM dual
子句中USING
的一部分
MERGE INTO events dest USING (
SELECT ? as event_timestamp,
? as device_id,
? as path,
? as message_id
FROM dual
)
src ON (
dest.event_timestamp = src.event_timestamp
AND dest.device_id = src.device_id
AND dest.path = src.path
AND dest.message_id = src.message_id
)
WHEN NOT MATCHED THEN INSERT (
event_timestamp,
device_id,
path,
message_id,
text,
direction,
speed,
net,
gross ) VALUES (?,?,?,?,?,?,?,?,?);
也可以使用像这样的普通INSERT INTO .. SELECT
。
INSERT INTO events (
event_timestamp,
device_id,
path,
message_id,
text,
direction,
speed,
net,
gross )
SELECT ?,?,?,?,?,?,?,?,? FROM DUAL
WHERE NOT EXISTS ( select 1 from events d WHERE
d.event_timestamp = ?
AND d.device_id = ?
AND d.path = ?
AND d.message_id = ?
);