Как я могу удалить дублирующиеся строки в таблице

найти:

$(".bayItem").on('click', function () {
    console.log($(".itemDivImage").find("span").text());
})

Вы можете изменить этот скрипт в соответствии со своими потребностями

14
задан Malik Daud Ahmad Khokhar 18 September 2008 в 11:35
поделиться

13 ответов

Я ВЫБРАЛ бы ОТЛИЧНЫЙ строки и бросил бы их во временную таблицу, затем отбросил бы исходную таблицу и скопировал бы назад данные из временного файла. РЕДАКТИРОВАНИЕ: теперь с фрагментом кода!

INSERT INTO TABLE_2 
SELECT DISTINCT * FROM TABLE_1
GO
DELETE FROM TABLE_1
GO
INSERT INTO TABLE_1
SELECT * FROM TABLE_2
GO
23
ответ дан 1 December 2019 в 06:32
поделиться

Можно ли добавить поле идентификационных данных первичного ключа к таблице?

0
ответ дан 1 December 2019 в 06:32
поделиться

После чистки текущей путаницы, Вы могли добавить первичный ключ, который включает все поля в таблицу. это помешает Вам попадать в беду снова. Конечно, это решение могло очень хорошо взломать существующий код. Это должно будет быть обработано также.

0
ответ дан 1 December 2019 в 06:32
поделиться

Manrico Corazzi - я специализируюсь на Oracle, не MS SQL, таким образом, необходимо будет сказать мне, если это возможно как Отпуск производительности boost:-

  1. то же, поскольку первый шаг - вставляет отличные значения в TABLE2 от TABLE1.
  2. Отбрасывание TABLE1. (Отбрасывание должно быть быстрее, чем удаляют, я принимаю, хотя усеченный быстрее, чем удаляют).
  3. Переименовывают TABLE2 как TABLE1 (экономит Вам время, поскольку Вы переименовываете объект вместо того, чтобы копировать данные от одной таблицы до другого).
0
ответ дан 1 December 2019 в 06:32
поделиться

Вот иначе с данными тестирования

create table #table1 (colWithDupes1 int, colWithDupes2 int)
insert into #table1
(colWithDupes1, colWithDupes2)
Select 1, 2 union all
Select 1, 2 union all
Select 2, 2 union all
Select 3, 4 union all
Select 3, 4 union all
Select 3, 4 union all
Select 4, 2 union all
Select 4, 2 


select * from #table1

set rowcount 1
select 1

while @@rowcount > 0
delete #table1  where 1 < (select count(*) from #table1 a2 
   where #table1.colWithDupes1 = a2.colWithDupes1
and #table1.colWithDupes2 = a2.colWithDupes2
)

set rowcount 0

select * from #table1
0
ответ дан 1 December 2019 в 06:32
поделиться

Как насчет:

select distinct * into #t from duplicates_tbl

truncate duplicates_tbl

insert duplicates_tbl select * from #t

drop table #t
0
ответ дан 1 December 2019 в 06:32
поделиться

Что относительно этого решения:

Первый Вы выполняете следующий запрос:

  select 'set rowcount ' + convert(varchar,COUNT(*)-1) + ' delete from MyTable where field=''' + field +'''' + ' set rowcount 0'  from mytable group by field having COUNT(*)>1

И затем просто необходимо выполнить возвращенный набор результатов

set rowcount 3 delete from Mytable where field='foo' set rowcount 0
....
....
set rowcount 5 delete from Mytable where field='bar' set rowcount 0

, я обработал случай, когда у Вас есть только один столбец, но довольно легко адаптировать тот же подход tomore, чем один столбец. Сообщите мне, хотите ли Вы, чтобы я отправил код.

0
ответ дан 1 December 2019 в 06:32
поделиться

Я не уверен, работает ли это с Операторами удаления, но это - способ найти дублирующиеся строки:

 SELECT *
 FROM myTable t1, myTable t2
 WHERE t1.field = t2.field AND t1.id > t2.id

я не уверен, можно ли просто изменить "ВЫБОР" на "УДАЛЕНИЕ" (кто-то хочет сообщить мне?) , но даже если Вы не можете, Вы могли бы просто превратить его в подзапрос.

-1
ответ дан 1 December 2019 в 06:32
поделиться

Добавьте столбец идентификационных данных, чтобы действовать как суррогатный первичный ключ и использовать это для идентификации двух из этих трех строк, которые будут удалены.

я рассмотрел бы отъезд столбца идентификационных данных на месте впоследствии, или если это - некоторая таблица ссылки, создайте составной первичный ключ на других столбцах.

7
ответ дан 1 December 2019 в 06:32
поделиться

Следующий пример работает также, когда Ваш PK является просто подмножеством всех столбцов таблицы.

(Примечание: Мне нравится подход со вставкой другого суррогатного идентификационного столбца больше. Но возможно это решение прибывает удобное также.)

Первая находка дублирующиеся строки:

SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

, Если существуют только немногие, можно удалить их вручную:

set rowcount 1
delete from t1
where col1=1 and col2=1

значение "rowcount" должно быть n-1 временами количество дубликатов. В этом примере существует 2 дубликата, поэтому rowcount равняется 1. Если Вы получаете несколько дублирующихся строк, необходимо сделать это для каждого уникального первичного ключа.

, Если у Вас есть много дубликатов, затем скопируйте каждый ключ однажды в anoher таблицу:

SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

Затем копируют ключи, но устраняют дубликаты.

SELECT DISTINCT t1.*
INTO holddups
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2

В Ваших ключах у Вас есть теперь уникальные ключи. Проверьте, не получаете ли Вы результата:

SELECT col1, col2, count(*)
FROM holddups
GROUP BY col1, col2

Удаляют дубликаты из исходной таблицы:

DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2

Вставляют исходные строки:

INSERT t1 SELECT * FROM holddups

btw и для полноты: В Oracle существует скрытое поле, которое Вы могли использовать (rowid):

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3... ;

см.: Microsoft Knowledge Site

7
ответ дан 1 December 2019 в 06:32
поделиться

Вот метод, который я использовал , когда я задал этот вопрос -

DELETE MyTable 
FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL
4
ответ дан 1 December 2019 в 06:32
поделиться

Это - способ сделать это с Общими Выражениями Таблицы, CTE. Это не включает циклов, никаких новых столбцов или чего-либо и не заставит нежелательных триггеров стрелять (из-за deletes+inserts).

Вдохновленный эта статья .

CREATE TABLE #temp (i INT)

INSERT INTO #temp VALUES (1)
INSERT INTO #temp VALUES (1)
INSERT INTO #temp VALUES (2)
INSERT INTO #temp VALUES (3)
INSERT INTO #temp VALUES (3)
INSERT INTO #temp VALUES (4)

SELECT * FROM #temp

;
WITH [#temp+rowid] AS
(SELECT ROW_NUMBER() OVER (ORDER BY i ASC) AS ROWID, * FROM #temp)
DELETE FROM [#temp+rowid] WHERE rowid IN 
(SELECT MIN(rowid) FROM [#temp+rowid] GROUP BY i HAVING COUNT(*) > 1)

SELECT * FROM #temp

DROP TABLE #temp   
4
ответ дан 1 December 2019 в 06:32
поделиться

Это - жесткая ситуация, чтобы быть в. Не зная Вашей конкретной ситуации (размер таблицы и т.д.) я думаю, что Ваш лучший выстрел должен добавить столбец идентификационных данных, заполнить его и затем удалить согласно ему. Можно удалить столбец позже, но я предложил бы, чтобы Вы сохранили его, поскольку это - действительно хорошая вещь иметь в таблице

2
ответ дан 1 December 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: