Удалить несколько вхождений одного и того же идентификатора и кода в соединительной таблице - PullRequest
0 голосов
/ 02 апреля 2012

enter code hereenter image description here

Моя проблема заключается в следующем: в этой базе данных таблица соединений содержит несколько строк, в которых kha_id и icd_fk совпадают.Хотя все в порядке, что kha_id появляется в icd_junction более одного раза, это должно быть с отдельным icd_fk.Я могу выполнить запрос и получить все идентификаторы # и коды, которые перечислены более одного раза, но существует ли отраслевой стандарт для удаления всех экземпляров, кроме одного? Например:

:что у меня выше

KHA_ID: 123456  V23 
        123456  V23
        123456  V24

I need one of the rows kha_id=123456 and ICD_FK=V23 taken out.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

This:

DELETE j1
  FROM ICD_Junction AS j1
 WHERE EXISTS
        ( SELECT 1
            FROM ICD_Junction AS j2
           WHERE j2.KHA_ID = j1.KHA_ID
             AND j2.ICD_FK = j1.ICD_FK
             AND j2.ID < j1.ID
        )
;

удалит для каждого KHA_ID и ICD_FK все, кроме одной соответствующей строки ICD_Junction.(В частности, он сохранит тот, у которого наименьшее значение ID, и удалит остальное.)

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

(Отказ от ответственности: не тестировался, и с тех пор, как я в последний раз использовал SQL Server, прошло некоторое время.)


Отредактировано, чтобы добавить: Если я правильно понимаю ваш комментарий, вам также нужна помощь с запросом, чтобы найти дубликаты?Для этого вы можете написать:

SELECT KHA_ID,
       ICD_FK,
       COUNT(1)          -- the number of duplicates
  FROM ICD_Junction
 GROUP
    BY KHA_ID,
       ICD_FK
HAVING COUNT(1) > 1
;
2 голосов
/ 03 апреля 2012

Исходный вопрос был удален, но комментарий был найден

       Select jDup.*
       FROM ICD_Junction AS j
       JOIN ICD_Junction AS jDup
       On  j.KHA_ID = jDup.KHA_ID
       AND j.ICD_FK = jDup.ICD_FK
       AND j.ID < jDup.ID

       Select max(jDup.ID), min(jDup.ID), count(*), jDup.KHA_ID, jDup.ICD_FK
       FROM  ICD_Junction AS jDup
       Group By jDup.KHA_ID, jDup.ICD_FK 
       Having Count(*) > 1
0 голосов
/ 03 апреля 2012

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

select * from  (select KHA_ID, ICD_FK, ROW_NUMBER() 
            OVER(PARTITION BY KHA_ID, ICD_FK
             ORDER BY ID ASC) AS RowID
    from ICD_Junction ) ordered where RowID > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...