#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 |
------- -------