从表A中删除表A中不存在子项且表B中不存在子项

时间:2014-06-28 15:46:06

标签: mysql sql-delete

我有一个用于简单树分类的传统父/子表和一个链接到类别的页面的“页面”表:

    **Table: cat**
    c_id
    c_name
    parent_id

    **Table: page**
    p_id
    page_name
    c_id

我想仅在cat表中没有子类别而页面表中没有子页面时才执行删除。我知道如何通过先计算和检查来做到这一点。但是,想知道它是否可以在单个查询中优雅地实现并获得受影响的行。

我已经尝试了这个并且它不起作用我认为不允许从删除查询中的目标表中进行选择?

    DELETE 
    FROM cat
    WHERE c_id=x
    AND NOT EXISTS (
    SELECT count( DISTINCT p_id ) as pages                       
    FROM page
    WHERE c_id =x
    )
    AND NOT EXISTS (
    SELECT count( DISTINCT c_id ) as children                       
    FROM cat
    WHERE parent_id =x
    );

1 个答案:

答案 0 :(得分:1)

即使从已连接的表中删除,DELETE JOIN仍然有效。这里我们LEFT JOIN检查是否有任何连接(c2是可能的父级,p是可能的引用页面)

最后,我们只删除没有连接的行(即连接返回为NULL);

DELETE c1
FROM cat c1
LEFT JOIN cat c2 
  ON c1.c_id = c2.parent_id
LEFT JOIN page p
  ON c1.c_id = p.c_id
WHERE c2.parent_id IS NULL
 AND p.c_id IS NULL
 AND c1.c_id = 1

An SQLfiddle to test with