2012-08-16 104 views
0

我正在深入使用SQL(使用Oracle 11g)的遺留代碼(C++/Qt)。我來到這片代碼(只是多行更改的變量名和寫一個更好的可讀性):兩個不同的INSERT INTO語句做同樣的事情

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) select 
999, 
D.FIRST, 
(select O.SECOND from TABLE_TWO O where O.ID=555), 
333, 
444 
from TABLE_ONE D where D.ID=666 

這在INSERT INTO ... SELECT ...

形式現在看來這裏「選擇」與插入一起使用來檢索並創建一行單行。但是,語法看起來很尷尬。我將它改爲:

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) values (
999, 
(select D.FIRST from TABLE_ONE D where D.ID=666), 
(select O.SECOND from TABLE_TWO O where O.ID=555), 
333, 
444) 

而且這個工作沒有任何問題。這是在形式INSERT INTO ... VALUES ...

在表現或任何其他方面是否有任何區別?因爲第二行對我來說似乎更自然。

+0

第一個示例允許您一次插入多於1行,在您的情況下這不會影響,但您可以根據WHERE條件插入多於一行的內容。第二個示例只插入一行。 – 2012-08-16 07:36:57

回答

2

不同之處在於結果集的基數。

無論TABLE_ONE中有多少行匹配D.ID=666,第一條語句都可以工作。而如果返回多於一行,則第二條語句將失敗。

爲了完整有第三個變化:

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) select 
999, 
D.FIRST, 
O.SECOND, 
333, 
444 
from TABLE_ONE D 
    cross join TABLE_TWO O 
where O.ID=555 
and D.ID=666 

Oracle優化是足夠聰明的知道TABLE_TWO是否匹配上唯一的密鑰,並相應地制定執行計劃。


關於相對性能,所有的變化應該是相同的。當然這是我希望如果兩個查詢都返回一行的話。如果TABLE_ONE返回多行,可能會有差異。與往常一樣,當調整查詢時,您必須對每種方法進行基準測試,因爲執行時間對數據量和偏差敏感。

+0

哪一個是性能最好的?我的意思是哪種方法是最好的,你的解決方案也是可讀的,但在那裏我知道3個選項:) – 2012-08-16 10:33:19