我有两张这样的桌子
- 单词(word_id,值);
word_map(sno(auto_inc), wm_id, service_id, word_id, base_id, root_id);
其中 sno 只是为了索引而自动递增。
wm_id 是每个服务唯一的实际 id,例如(serviceid,wm_id 一起形成一个唯一键)。
- base_id 和 root_id 引用到 wm_id 即,我存储正在插入的新单词的相应 wm_id 的值。
我现在的要求是我想从该表中删除记录,其中表中不存在单词的 base_id 或 root_id
例如,
一个 tr_id = 4 的新词,它的 base_id = 2 和 root_id = 1 那么必须有另外两条 tr_id 为 2 和 1 的记录,如果不是,我们可以称它为孤儿,并且必须删除 wm_id = 4 的记录,然后记录与其他 wm_ids 具有此 4 作为 base_id 或 root_id 也必须被删除,因为如果 4 被删除,它们现在也会成为孤儿,依此类推。
任何人都可以建议我解决问题的方法。
我尝试了什么:
我尝试使用 while 编写一个过程,其中有一个查询,例如,
从 words_map 中删除 base_id 不在(从 words_map 中选择 wm_id)或 root_id 不在(从 words_map 中选择 wm_id)但是使用这种嵌套查询在同一个表上删除/或更新是不可能的,所以我正在寻找另一种方式。
我怀疑的是:
我想过将这些 wm_ids 读入一个数组,然后在此基础上一一删除,但我认为我们在存储过程中没有数组。
Cursor 是这种情况的替代方案吗?
或针对此问题的任何其他最佳解决方案。
编辑 1:请通过此http://sqlfiddle.com/#!2/a4b6f/15获取清晰的实验数据
任何早期帮助将不胜感激