我在Oracle中需要一些MERGE命令的帮助。基本上我有这个命令,但我想再优化一下:
MERGE INTO swap USING dual ON (SELECT id FROM student WHERE number = '123')
WHEN MATCHED THEN
UPDATE SET swapped = 1, last_swap = sysdate
WHEN NOT MATCHED THEN
INSERT (student_id, swapped, last_swap) VALUES ((SELECT id FROM student WHERE number= '123'), 1, sysdate)
现在,这将在SWAP表上插入或更新寄存器。但是,我想保护它不会在student_id上插入NULL,如果在STUDENT表上没有这个号码的学生(我不想在SWAP表的sudent_id上只是不允许NULL值)。
另外,我重复SELECT id FROM student WHERE number = '123'
两次,如何更改它只执行一次(将结果存储在别名或其他内容中)?
提前多多感谢!
答案 0 :(得分:2)
您的合并声明应使用“从学生中选择”作为您要合并的表格。 你也可以发布一些样本数据吗?
以下查询假设ID是您要合并的列,并且不能为空。
MERGE INTO swap
USING (SELECT id FROM student WHERE number = '123' and id is not null) stu
on (stu.id = swap.id)
WHEN MATCHED THEN
UPDATE SET swapped = 1, last_swap = sysdate
WHEN NOT MATCHED THEN
INSERT (student_id, swapped, last_swap) VALUES (stu.id , 1, sysdate);