【问题标题】:Basic SQL Insert statement approach基本 SQL 插入语句方法
【发布时间】:2011-06-10 17:43:07
【问题描述】:

鉴于我有两张桌子

  • 客户(id int,用户名 varchar)
  • 订单(customer_id int, order_date datetime)

现在我想根据客户表中提供的客户信息插入订单表。

有几种方法可以解决这个问题。

首先 - 我可以将客户信息查询到一个变量中,然后在 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 表中查询到大量信息,那么第二种方法要好得多。

附言我在一次技术面试中被问到这个问题。

【问题讨论】:

  • 你是如何回答采访中的问题的?
  • 我给了他们一个和你一样的答案。就是想听听大家的意见。感谢您的回复。

标签: sql sql-server


【解决方案1】:

第二种方法更好。

如果找不到客户,第一种方法将失败。没有进行检查以确保客户 ID 已被退回。

如果找不到客户,第二种方法将不起作用。

从开销方法来看,如果不需要变量,为什么要创建变量。基于集合的 sql 通常是更好的方法。

【讨论】:

    【解决方案2】:

    在典型的现实世界订单输入系统中,用户已经通过搜索界面查找了客户,或者从按字母顺序显示的客户列表中选择了客户;因此,您的客户端程序在为该客户插入订单时,已经知道 CustomerID。

    此外,订单日期通常默认为 getdate() 作为 ORDERS 表定义的一部分,您的查询通常可以忽略该列。

    但是要处理一个订单上的多个订单项,您在 ORDER_HEADER 中的插入需要返回订单标题 ID,以便它可以插入到 ORDER DETAIL 订单项子行中。

    【讨论】:

      【解决方案3】:

      我不推荐任何一种方法。为什么你首先有客户名称而不是 id?您是否没有通过将 ID 保持在其状态来维护对当前客户的引用的用户界面?按名称进行查找会使您有可能选择错误的客户。

      如果您出于我不知道的原因必须这样做,那么第二种方法肯定更有效,因为它只包含一个语句。

      【讨论】:

        【解决方案4】:

        将订单表中的客户id设为外键,指向客户表。

        【讨论】:

          猜你喜欢
          • 2023-03-17
          • 2014-05-25
          • 2015-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多