2011-06-10 69 views
1

假設我有兩個表基本SQL INSERT語句的方法

  • 客戶(ID INT,用戶名VARCHAR)
  • 訂單(CUSTOMER_ID INT,order_date的日期時間)

現在我要插入根據Customer表中可用的客戶信息進入Order表。

有幾種方法可以解決這個問題。

首先 - 我可以將客戶信息查詢到變量中,然後在INSERT語句中使用它。

DECLARE @Customer_ID int 
SELECT @Customer_ID = id FROM Customer where username = 'john.smith' 
INSERT INTO Orders (customer_id, order_date) VALUES (@Customer_ID, GETDATE()) 

第二種方法是使用INSERT和SELECT查詢的組合。

INSERT INTO Orders (customer_id, order_date) 
SELECT id, GETDATE() FROM Customers 
WHERE username = 'john.smith' 

所以我的問題是,哪一個更好的方式來進行速度和開銷,爲什麼?我知道如果我們從客戶表中獲得了很多信息,那麼第二種方法要好得多。

p.s.我在其中一次技術採訪中被問到這個問題。

+0

你是如何回答面試中的問題的? – 2011-06-14 22:17:38

+0

我給了他們一個和你一樣的答案。只是想獲得每個人的意見。謝謝回覆。 – 2011-06-15 03:15:25

回答

4

第二種方法更好。

如果找不到客戶,第一種方法將失敗。沒有進行檢查以確保客戶ID已被退回。

如果找不到客戶,第二種方法將不會執行任何操作。

從頭頂上的方法爲什麼創建變量,如果他們不需要。基於sql的設置通常是更好的方法。

1

我不推薦這兩種方法。爲什麼你首先有客戶名稱而不是ID?您是否擁有一個用戶界面,通過將ID保持在其狀態來維護對當前客戶的引用?按名稱查找可能會讓您選擇錯誤的客戶。

如果您必須爲我未知的原因這樣做,第二種方法肯定更有效,因爲它只包含一個語句。

1

在一個典型的現實世界的訂單輸入系統中,用戶已經通過搜索界面查看客戶,或者從按字母順序顯示的客戶列表中選擇客戶;因此您的客戶程序在爲該客戶插入訂單時已知道該客戶ID。

此外,訂單日期通常默認爲getdate()作爲ORDERS表定義的一部分,並且您的查詢通常可以忽略該列。

但是,要處理訂單上的多個訂單項,您插入ORDER_HEADER需要返回訂單標題ID,以便它可以插入ORDER DETAIL行項目子行中。

0

使顧客ID順序表引用客戶表的外鍵。