我有一个用于简单树分类的传统父/子表,还有一个用于链接到类别的页面的“页面”表:
**Table: cat**
c_id
c_name
parent_id
**Table: page**
p_id
page_name
c_id
仅当cat表中没有子类别并且page表中没有子页面时,我才想执行删除操作。我知道如何通过首先计数和检查来做到这一点。但是,想知道是否可以在单个查询中很好地实现它并获取受影响的行。
我已经尝试过了,但是它不起作用,因为我认为不允许在删除查询中从目标表中进行选择?
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
);
即使从联接表中删除,DELETE 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句