http://sqlfiddle.com/#!9/429f91/10
我有一个源表,我已从中将同义词对收集到临时表中,例如
+-------+---------+--------+-----------+
| Name | Synonym | NameID | SynonymID |
+-------+---------+--------+-----------+
| Yes | Oui | 1 | 2 |
| Yes | Da | 1 | 3 |
| Yes | Si | 1 | 4 |
| Oui | Yes | 2 | 1 |
| Oui | Da | 2 | 3 |
| Oui | Si | 2 | 4 |
| Da | Yes | 3 | 1 |
| Da | Oui | 3 | 2 |
| Da | Si | 3 | 4 |
| Si | Yes | 4 | 1 |
| Si | Da | 4 | 3 |
| Si | Oui | 4 | 2 |
| Red | Rouge | 5 | 6 |
| Rouge | Red | 6 | 5 |
+-------+---------+--------+-----------+
目的是从源表中删除除单个术语之外的所有术语,使其没有同义词。上面的 SqlFiddle 包含表格并选择,但我不清楚如何
对同义词进行分组(例如,在本例中为"是"、"Oui"、"Da"、"Si"和"红色"、"胭脂"(
选择除每个组的最小 (ID( 之外的所有
本质上是希望做这样的事情:
Delete from SourceTable where ID in (SELECT QUERY FROM TEMP TABLE WITH ALL BUT MIN IDS FROM EACH GROUP
在这种情况下,这将在
Delete from SourceTable where ID in (2,3,4,6)
您的条件是:"不应存在具有较小 ID 的同义词" - 这可以写为 NOT EXISTS 子查询:
select distinct NameID
from Synonyms s
where not exists (
select *
from Synonyms s1
where s1.SynonymID = s.NameID
and s1.NameID < s.NameID
)
这将返回 ID 1 和 5。
另一种方式是
select distinct s.NameID
from Synonyms s
left join Synonyms s1
on s1.SynonymID = s.NameID
and s1.NameID < s.NameID
where s1.SynonymID is null
数据库小提琴
获取相反的结果集甚至更简单:
select distinct SynonymID
from Synonyms
where SynonymID > NameID
这将返回 2,3,4,6