當查詢Oracle的INSERT語法時,我發現您可以插入到查詢中,例如,插入到查詢中
insert into (select * from dept) (deptno, dname) values (99, 'new department');
任何人都可以闡明這是什麼意思?我可以通過插入一個查詢來實現什麼功能,而不能直接插入表中?
UPDATE:到目前爲止,似乎這僅僅是一個替代語法,所以我可以寫,而不是
insert into (select deptno, dname from dept) values (99, 'new department');
insert into dept (deptno, dname) values (99, 'new department');
同樣的事情,同樣的執行計劃。查詢是否返回記錄無關緊要。這:
insert into (select deptno, dname from dept where 1 = 0) values (99, 'new department');
再次導致相同的執行計劃。所以我們可能會認爲,只要我們只從一個表中選擇列,那麼子查詢的樣子實際上並不重要。但不是。這:
insert into (select deptno, dname from dept cross join some_table)
values (99, 'new department');
導致「ORA-01779:不能修改它映射到非鍵保存表列」或「ORA-01732:數據處理操作這種觀點不合法」。
我的印象是,Oracle決定允許插入到查詢中,因爲它們允許插入到視圖中,還有什麼是子查詢,然後是特定視圖?所以當你可以插入到視圖中時,它們當然也可以讓你插入到臨時視圖中,但是當然沒有人在他們的正確思想中使用這種語法:-)
但是也許我錯了?也許這個語法提供了一些我還沒有意識到的東西?如果是這樣告訴我:-)
啊,你是說這只是一種替代語法?我可以'插入到dept(deptno,dname)值(...)'或'插入(選擇deptno,從dept的dname)值(...)'。所以這只是另一種寫同樣東西的方式,沒有一種比另一種更有優勢。 –
基本上是 - 雖然我還沒有研究過可能的後果。基於我不希望他們的文檔,除非你在相應的表上只有'insert'特權而不是'select'。 – collapsar