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包含了表并选择了,但我不清楚如何
从本质上说,希望做的事情如下:
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)发布于 2019-06-04 13:04:25
您的条件是:“不应该存在带有较小ID的同义词”--这可以编写为子查询:
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获取oposite结果集甚至更简单:
select distinct SynonymID
from Synonyms
where SynonymID > NameID这将返回2,3,4,6
https://stackoverflow.com/questions/56444180
复制相似问题