2011-12-28 94 views
1

我需要一些在Oracle中的MERGE命令的幫助。基本上我有這個命令,但我想優化一點:Oracle SQL:與比匹配/不匹配更多的條件合併

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表上沒有這個數字的學生(我不想簡單地在SWAP表的sudent_id上不允許NULL值),我想保護它免於在student_id上插入NULL。 其他的事情,我重複SELECT id FROM student WHERE number = '123'兩次,我怎樣才能改變它只執行一次(將結果存儲在別名或其他東西中)?

非常感謝!

回答

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