Oracle SQL:合并的条件多于匹配/不匹配的条件

时间:2011-12-28 14:59:01

标签: sql oracle merge

我在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'两次,如何更改它只执行一次(将结果存储在别名或其他内容中)?

提前多多感谢!

1 个答案:

答案 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);