【发布时间】:2014-12-19 07:29:27
【问题描述】:
我有两个设计不佳的表格 Form 和 FormDetails 我正在尝试清理。
Form 表包含有关我的应用程序中表单状态的信息:
+-----------------------------------------+
| form_id | status_id | form_created_by |
+-----------------------------------------+
| 1 | 1 | abc |
+-----------------------------------------+
| 2 | 3 | def |
+-----------------------------------------+
form_id,在 Form 表中,是主键。
FormDetails 表包含有关表单的其他信息:
+-----------------------------------------+
| form_id | status_id | process_id |
+-----------------------------------------+
| 1 | 1 | 1 |
+-----------------------------------------+
| 2 | 2 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
form_id,在 Form 表中,是 NOT 主键或外键。没有限制。该表设计不当,随着时间的推移,重复数据已添加到该表中。
我想通过将唯一数据复制到新的 FormDetails 表中并将 form_id 设置为 Form 表的外键来清理此表。
为了实现这一点,我尝试了以下查询:
select *
from FormDetails fd
right join Form f on f.form_id = fd.form_id and f.status_id = fd.status_id
不幸的是,我仍然收到带有重复 form_id 的行,因为 form_id=2 有两行 status_id=3。
+-----------------------------------------+
| form_id | status_id | process_id |
+-----------------------------------------+
| 1 | 1 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
我要写的是一个查询:选择 FormDetails 中与当前表单相对应的所有行。如果有重复项,只需选择其中一个即可。
知道如何编写这样的查询吗?
我想看到的是:
+-----------------------------------------+
| form_id | status_id | process_id |
+-----------------------------------------+
| 1 | 1 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
【问题讨论】:
-
你用的是什么数据库?
-
@GordonLinoff SQL Server 2005。我现在添加了 sql-server 作为标签...
-
我只是凭记忆,但我认为 SELECT DISTINCT for MSSQL 应该可以解决问题。
标签: sql sql-server select duplicates