2011-06-10 72 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顺序表引用客户表的外键。