首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据另一个表中的值删除行

根据另一个表中的值删除行
EN

Stack Overflow用户
提问于 2020-05-26 15:50:00
回答 2查看 895关注 0票数 2

如何根据来自另一个表的值删除customer表中的行,例如orders

如果客户没有活动订单,则应该可以将它们与行一起从DB中删除(使用CASCADE完成)。但是,如果他们有任何有效的命令,他们不能被删除。

我想到了一个PLPGSQL函数,然后在触发器中使用它来检查,但我迷路了。我有一个基本的SQL块,如下所示,我第一个想法就是相应地删除记录。但是它不能正常工作,因为它不管状态如何都会删除客户,它只需要在这个函数中取消一个订单,而不是全部取消。

代码语言:javascript
代码运行次数:0
运行
复制
CREATE OR REPLACE FUNCTION DelCust(int)
RETURNS void AS $body$
    DELETE FROM Customer 
      WHERE CustID IN (
      SELECT CustID
      FROM Order
      WHERE Status = 'C'
      AND CustID = $1
    );
$body$
LANGUAGE SQL;

SELECT * FROM Customer;

我也尝试过使用PLPGSQL函数返回触发器,然后使用触发器来帮助删除和检查,但我对它感到迷茫。对如何解决这个问题有什么想法吗?有什么好的资料可供进一步阅读吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-26 15:57:09

你们很亲密。我建议你用NOT IN代替IN

代码语言:javascript
代码运行次数:0
运行
复制
DELETE FROM Customer 
  WHERE CustID = $1 AND
        CustID NOT IN (SELECT DISTINCT CustID
                         FROM Order
                         WHERE Status = 'A');

我猜Status = 'A'的意思是“活动秩序”。如果是其他的东西,适当地修改代码。

票数 1
EN

Stack Overflow用户

发布于 2020-05-28 16:42:28

您的基本功能可以这样工作:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE OR REPLACE FUNCTION del_cust(_custid int)
  RETURNS int  --③
  LANGUAGE sql AS
$func$
DELETE FROM customer c
WHERE  c.custid = $1
AND    NOT EXISTS ( -- ①
   SELECT FROM "order" o  -- ②
   WHERE  o.status = 'C'  -- meaning "active"?
   AND    o.custid = $1
   );
RETURNING c.custid; -- ③
$func$;

1 NOT IN,如果可以的话。这是低效和潜在的危险。相关信息:

2 "order“是SQL中的保留字。最好选择一个合法的标识符,否则你必须总是双引号。

3我用RETURNS int来表示该行是否真的被删除了。如果DELETE不通过,则函数返回NULL。可选的加法。

对于触发器实现,请考虑以下密切相关的答案:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62026157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档