[英]Find all linked records using self join
我有这张表,我正在尝试使用自联接。 我只能达到预期结果的 50%。
create table auto_correct(spell varchar(255), ne varchar(255));
insert into auto_correct values ('test', 'testing');
insert into auto_correct values ('adn', 'and');
insert into auto_correct values ('and', 'andru');
insert into auto_correct values ('testing', 'tested');
insert into auto_correct values ('this', 'that');
insert into auto_correct values ('junk', 'delete');
拼写 | ne |
---|---|
测试 | 测试 |
广告 | 和 |
和 | 安德鲁 |
测试 | 测试 |
这 | 那 |
垃圾 | 删除 |
单词“test”通过“testing”链接到“tested” 单词“adn”通过“and”链接到“andru” 如何找到所有此类链接记录并与非链接行一起显示?
预期的结果是:
拼写 | ne |
---|---|
测试 | 测试 |
广告 | 安德鲁 |
这 | 那 |
垃圾 | 删除 |
我试过这个:
select b.spell, a.ne
from auto_correct as a
left join auto_correct as b on a.spell = b.ne
where b.spell is not null;
返回:
广告 | 安德鲁 |
---|---|
测试 | 测试 |
上述输出中缺少未找到匹配项的其余记录。
WITH RECURSIVE
cte AS ( SELECT *
FROM auto_correct
WHERE NOT EXISTS ( SELECT NULL
FROM auto_correct ac
WHERE auto_correct.spell = ac.ne )
UNION ALL
SELECT cte.spell, auto_correct.ne
FROM cte
JOIN auto_correct ON cte.ne = auto_correct.spell )
SELECT *
FROM cte
WHERE NOT EXISTS ( SELECT NULL
FROM auto_correct
WHERE auto_correct.spell = cte.ne )
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e90235ce5dde96a7255f8afe1a19d334
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.