鉴于我有两张桌子
现在我想根据客户表中提供的客户信息插入订单表。
我有几种方法可以解决这个问题。
首先 - 我可以将客户信息查询到变量中,然后在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'
所以我的问题是,哪种方式在速度和开销方面更好,为什么?我知道如果我们从Customer表中查询了很多信息,那么第二种方法就会好得多。
P.S。我在其中一次技术访谈中被问到这个问题。
答案 0 :(得分:4)
第二种方法更好。
如果找不到客户,第一种方法将失败。没有进行检查以确保已返回客户ID。
如果找不到客户,第二种方法将无效。
从开销方法中,为什么在不需要时创建变量。基于集合的sql通常是更好的方法。
答案 1 :(得分:1)
我不推荐任何一种方法。为什么你首先拥有客户名称而不是id?您是否拥有通过将ID保持在其状态来维护对当前客户的引用的用户界面?按名称进行查找会使您可能选择错误的客户。
如果你因为我不知道的原因必须这样做,那么第二种方法肯定会更有效率,因为它只包含一个陈述。
答案 2 :(得分:1)
在典型的现实订单输入系统中,用户已经通过搜索界面查看了客户,或者从按字母顺序显示的客户列表中选择了客户;所以当你的客户端程序为该客户插入订单时,已经知道了CustomerID。
此外,订单日期通常默认为getdate()作为ORDERS表定义的一部分,您的查询通常可以忽略该列。
但是要处理订单上的多个订单项,您在ORDER_HEADER中的插入需要返回订单标题ID,以便可以将其插入ORDER DETAIL订单项子行。
答案 3 :(得分:0)
使订单表中的客户ID成为引用客户表的外键。