Oracle删除“多对多”关系表数据

时间:2013-01-18 01:32:34

标签: oracle join

我有3个表,它们是多对多的关系。即:

 Create Table Product(ProductId number(18,0) NOT NULL);

 Create Table Customer(CustomerId number(18,0) NOT NULL);

 Create Table CustomerProduct(CustomerId number(18,0) NOT NULL,ProductId number(18,0) NOT NULL);

由于CustomerProduct表引用了Product和Customer表。我试图从CustomerProduct表中删除数据。

我只能找到类似的东西:

DELETE FROM
(
   SElECT CustomerProduct.* FROM CustomerProduct
   INNER JOIN Product ON Product.ProductId = CustomerProduct.ProductId
   INNER JOIN Customer ON Customer.CustomerId = CustomerProduct.CustomerId
   WHERE Product.ProductId = 1 AND Customer.CustomerId = 7

);

注意:外键上没有定义CASCADE删除... Oracle不允许我在SQL SERVER中执行某些操作

DELETE A
FROM A
INNER JOIN B on a.Id = b.id
WHERE b.Id = 2.....

3 个答案:

答案 0 :(得分:1)

我不明白你想做什么。 从表CustomerProduct中删除可以使用简单的delete语句完成,如下所示:

  delete CustomerProduct 
  where ProductId = 1 and CustomerId  = 7

答案 1 :(得分:1)

我遇到了同样的问题。我用触发器解决了很好的问题。

create or replace TRIGGER "AUTO_DELETE_PRODUCTS" 
BEFORE DELETE ON Product 
FOR EACH ROW
BEGIN
  DELETE FROM CustomerProduct WHERE CustomerProduct.ProductId = :old.ProductId;
END;

您可以为其余表执行此操作。这样当你删除其中一条记录时,信息就会被删除。

答案 2 :(得分:0)

我花了几个小时试图解决这个问题,你在问题中得到了正确答案。但是,如果您将查询更改为关系表中不存在相关条件的位置,那么为什么需要连接会更有意义。

类似的东西:

CREATE TABLE Product(ProductId number(18,0) NOT NULL, Name VARCHAR2(30));
CREATE TABLE Customer(CustomerId number(18,0) NOT NULL, Name VARCHAR2(30));

DELETE FROM
    (SELECT cp.* 
       FROM CustomerProduct cp
       INNER JOIN Product p ON p.ProductId = cp.ProductId
       INNER JOIN Customer c ON c.CustomerId = cp.CustomerId
       WHERE c.Name LIKE 'TEST%' AND p.Name IS NULL);