Удалить повторяющиеся строки № 2 - PullRequest
3 голосов
/ 27 января 2011

У меня есть таблица (большая ~ 1 000 000 строк), которая может содержать повторяющиеся строки (возможные значения NULL).

Что я хочу сделать, это:

  1. Выберите только отдельные строки.
  2. Удалить строки с повторяющимся полем 'id'.

Давайте иметь таблицу:

id | a | b    
1  | 2 | 3    
2  | 8 | 7    
3  | 9 | 10    
2  | 8 | 7    
3  | 20| 12

То, что я хочу получить:

id | a | b    
1  | 2 | 3    
2  | 8 | 7

Строка с идентификатором 2 сохраняется в одном экземпляре, а строки с идентификатором 3 удаляются.

Я думал о:

  1. SELECT DISTINCT id, a, b FROM table; чтобы получить только отдельные строки.
  2. Каким-то образом отфильтруйте результат (1), чтобы удалить повторяющиеся идентификаторы.

Как лучше всего подойти к этому?

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Третий ответ, теперь, когда вопрос немного яснее:

SELECT id, min(a) as a, min(b) as b
FROM (SELECT DISTINCT id, a, b FROM table) t
GROUP BY id
HAVING count(*) =1
0 голосов
/ 27 января 2011

Можете ли вы перестроить базу данных или, если нет, построить новую из оригинала с идентификатором в качестве первичного ключа?SQL может позаботиться обо всем остальном.

0 голосов
/ 27 января 2011

Петр, похоже на комментарии, ты хочешь КОМБИНАЦИЮ ...

Включает в себя: Все строки, где идентификатор встречается ТОЛЬКО ОДИН РАЗ Все строки, в которых идентификатор встречается более одного раза - И все остальные поля в записи совпадают

ИСКЛЮЧИТЬ: Любая строка, в которой идентификатор встречается более одного раза - И другие поля не совсем совпадают.

select ID, min(a) a, min(b) b
    from YourTable
    group by ID
    having min(a) = max(a)
       and min(b) = max(b)

Если у вас есть еще столбцы для сравнения, кроме a и b, просто добавьте соответствующие значения в список выбора полей и соответствующие им значения. Из предоставленного вами образца данных значения, возвращаемые запросом, будут

ID  MIN(A)  MIN(B)    Having MIN(A)  MAX(A)  MIN(B)  MAX(B)
1    2        3                2        2       3      3 
2    8        7                8        8       7      7
3    9       10                9       20      10     12    

Таким образом, строка ID = 3 будет сброшена, поскольку произойдет сбой при наличии одинакового min () и max () одного и того же столбца в обоих столбцах. Затем вы можете скопировать это в новую таблицу. Только один проход через стол ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...