У меня есть две плохо разработанные таблицы Form и FormDetails, которые я пытаюсь очистить.Как отфильтровать дубликаты?
В таблице Форма содержит информацию о состоянии формы в моем приложении:
+-----------------------------------------+
| form_id | status_id | form_created_by |
+-----------------------------------------+
| 1 | 1 | abc |
+-----------------------------------------+
| 2 | 3 | def |
+-----------------------------------------+
form_id, в виде таблицы, является первичным ключом.
В таблице FormDetails имеет дополнительную информацию о форме:
+-----------------------------------------+
| form_id | status_id | process_id |
+-----------------------------------------+
| 1 | 1 | 1 |
+-----------------------------------------+
| 2 | 2 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
| 2 | 3 | 1 |
+-----------------------------------------+
form_id, в виде таблицы, является НЕ первичного или внешнего ключа. Нет ограничений. Эта таблица плохо разработана, и со временем дублирующиеся данные были добавлены в эту таблицу.
Я хотел бы очистить эту таблицу, скопировав уникальные данные в новую таблицу FormDetails и сделав form_id внешним ключом в таблице форм.
Для того, чтобы достичь этого я попробовал следующий запрос:
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-сервер в качестве тега ... – mezoid
Я иду по памяти, но я думаю, что SELECT DISTINCT для MSSQL должен сделать трюк. – Jonathan