【问题标题】:Create a stored procedure to delete rows that have no values创建存储过程以删除没有值的行
【发布时间】:2012-11-24 23:31:23
【问题描述】:

创建一个名为 sp_del_inactive_cust 的存储过程来删除没有订单的客户。存储过程应删除 1 行。

这是我正在使用的数据库。
(来源:bcitwebdev.com

我的直接想法是我需要对照订单表检查客户表。如果客户出现在客户表中但不在订单表中,这一定意味着他们没有在其客户 ID 下创建任何订单 ID。然后,如果客户没有任何订单,我必须删除他们。

我不确定如何编写这个问题的脚本。我需要帮助!请保持简单,因为我是第一学期的学生。

这是我尝试过的开始:

CREATE PROCEDURE     sp_del_inactive_cust
AS
SELECT               customers.customer_id,
                 orders.customer_id
FROM         customers
INNER JOIN           orders ON customers.customer_id=orders.customer_id
WHERE        /* customer_id is found in customers table but not in orders table */

然后我将执行该过程。

感谢 Michael Fredrickson 的帮助,此问题已得到解答。

以下是删除所需 1 行的最终语句:

CREATE PROCEDURE        sp_del_inactive_cust
AS
DELETE                  customers
FROM                    customers
LEFT OUTER JOIN         orders ON customers.customer_id = orders.customer_id
WHERE                   orders.customer_id IS NULL;
GO

EXECUTE                 sp_del_inactive_cust;
GO

【问题讨论】:

  • 您不能为此创建触发器,因为您将在客户表中输入的每条记录在输入时都没有订单。您可以在每小时运行的工作中执行此操作。
  • 好的,如果不是触发器,我还能如何运行这个程序?我还没有学习如何运行工作。
  • 哦,永远不要命名存储过程 sp_ - 系统过程使用它。
  • 并且存储过程绝对不应该删除一行。如果一次添加多行,这将导致表永远不会是最新的。如果你的老师让你做这种愚蠢的事情,他或她显然是不称职的。您希望在数据库中成组地处理事情,而不要一次只考虑一行。
  • 好吧...我会这样命名,因为这是我学校的要求。

标签: sql select stored-procedures inner-join procedure


【解决方案1】:
DELETE customers 
WHERE customer_id NOT IN (SELECT customer_id FROM Orders)

【讨论】:

    【解决方案2】:

    我不想只给你答案,所以我会给你一个相反的例子,让你弄清楚其余的

    这是一个例子

    2 表 foo {foo_id, a, b, c} 酒吧 {bar_id, foo_Id, e, f, g}

    如果我想删除 foo 中出现在 bar 表中的所有记录,我会写

    删除 foo where foo_id in (select foo_id from bar)

    查找“in”关键字以获得真正的解释 此外,做某事的方法总是有很多,如果你不按照老师的要求做事,你可能无法在课堂上取得适当的成绩

    【讨论】:

      【解决方案3】:

      您将需要创建一个反加入来获取未下订单的客户,如下所示:

      DELETE c FROM
      FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id
      WHERE o.customer_id IS NULL
      

      【讨论】:

        【解决方案4】:
        CREATE PROCEDURE sp_del_inactive_cust
        
        AS
        
        DELETE TOP (1) c
        FROM
            customers c
            LEFT OUTER JOIN orders o
                ON C.customer_id = o.customer_id
        WHERE
            o.customer_id IS NULL
        

        【讨论】:

        • 对不起,我最初错过了一条记录的要求,我已经删除了反对票并用赞成票替换了它
        • @HLGEM 谢谢先生......我同意我认为这不是解决问题的正确方法......但听起来 OP 刚刚有一个疯狂的教授给出了奇怪的要求。
        • 可悲的是,他所教的内容非常危险。我当然不会允许任何人靠近我的数据库来编写这个人的教学方式。
        • 谢谢!这很有帮助。稍微调整了一下。我将编辑我的原始帖子。
        猜你喜欢
        • 2022-11-14
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        相关资源
        最近更新 更多