我有一个用于简单树分类的传统父/子表和一个链接到类别的页面的“页面”表:
**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
);
答案 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