首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Min(ID)删除同义词对

使用Min(ID)删除同义词对
EN

Stack Overflow用户
提问于 2019-06-04 12:45:05
回答 1查看 21关注 0票数 0

http://sqlfiddle.com/#!9/429f91/10

我有一个源表,我将同义词对收集到临时表中。

代码语言:javascript
复制
+-------+---------+--------+-----------+
| 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包含了表并选择了,但我不清楚如何

  1. 将同义词分组(例如,在本例中为“Yes”、“Oui”、“Da”、“Si”和“Red”、“Rouge”)
  2. 为每个组选择除Min(ID)之外的所有

从本质上说,希望做的事情如下:

Delete from SourceTable where ID in (SELECT QUERY FROM TEMP TABLE WITH ALL BUT MIN IDS FROM EACH GROUP

在这件案子里

代码语言:javascript
复制
Delete from SourceTable where ID in (2,3,4,6)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-04 13:04:25

您的条件是:“不应该存在带有较小ID的同义词”--这可以编写为子查询:

代码语言:javascript
复制
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。

另一种方式是

代码语言:javascript
复制
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结果集甚至更简单:

代码语言:javascript
复制
select distinct SynonymID
from Synonyms
where SynonymID > NameID

这将返回2,3,4,6

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56444180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档