Как найти и сгруппировать записи с начальными нулями и их встречную часть (дубликат) запись, в которой были удалены начальные нули в БД

#sql #sql-server #tsql

#sql #sql-server #tsql

Вопрос:

У меня есть база данных, в которой есть правильно отформатированные записи с начальными нулями. Однако в БД также были добавлены те же записи, за исключением того, что начальные нули были удалены (спасибо Excel). По сути, создавая дубликаты записей, которые следуют неправильному соглашению о нумерации. Итак, в БД есть записи с правильными идентификаторами, такими как…

 01234,
01122,
01323,
  

но также с неправильными идентификационными номерами, такими как

 1234,
1122,
1323,
  

Я пытаюсь выполнить запрос, который вернет результирующий набор, объединяющий эти повторяющиеся записи в БД следующим образом:

 01234,
1234,
01122,
1122,
01323,
1323,
  

Любые мысли приветствуются.

Ответ №1:

Я использовал CROSS APPLY для повторного запроса таблицы.

Запрос в CROSS APPLY ищет «совпадения», где значения they были бы равны, если бы они оба были CAST целыми числами, но не равны строковым значениям. Затем, чтобы немного очистить набор результатов, я ограничил его тем, где базовое значение не начинается с нулевого символа. В противном случае запрос извлекал совпадения в обоих направлениях, что не казалось полезным.

Настройка данных:

 DECLARE @t TABLE
  (
    idCol VARCHAR(10) NOT NULL
  );

INSERT @t
  (
    idCol
  )
VALUES
  ('01234')
 ,('01122')
 ,('01321')
 ,('1234')
 ,('1122')
 ,('1321')
 ,('00012');
  

Запрос:

 SELECT
  t.idCol
 ,c.idCol
FROM
  @t AS t
CROSS APPLY
  (
    SELECT
      idCol
    FROM
      @t
    WHERE
      idCol = CAST(t.idCol AS INT)
      AND idCol <> t.idCol
      AND LEFT(idCol, 1) <> '0'
  ) AS c;
  

Результаты:

  ------- ------- 
| idCol | idCol |
 ------- ------- 
| 01234 |  1234 |
| 01122 |  1122 |
| 01321 |  1321 |
 ------- -------