Публикация

А как Вы чистите справочники?

После импорта данных о контрагентах из Excel часто в справочниках получается достаточно много мусора. Вот на днях столкнулась с тем, что появилось больше 10 разных "Самарских областей" различных вариантов написания. С опечатками, с сокращениями, с точками и даже с запятыми. Ну и города, конечно, тоже поражали разнообразием. Кроме Самары, Саамры, Cfvfhs и г. Самары (и еще около 10 различных вариантов написания) был даже город "их сисадмин - Владислав". Но, сисадмин здесь ни при чем, его я убрала вручную :) А вот сливать кучу Самар предпочла скриптом. Ведь к каждому из городов был привязан контрагент, адрес контрагента и контакт.

Я сделала так:

UPDATE tbl_Account SET CityID = '{3F239901-370A-49E1-8E55-AF816D36373F}' WHERE CityID IN (SELECT ID FROM tbl_City WHERE Name LIKE '%Самар%')

Для таблиц tbl_Account, tbl_AccountAddress, tbl_Contact и tbl_ContactAddress. При этом CityID - ID "правильного" города, а текст в like я меняла для разных случаев.

Также почистила и StateID в этих таблицах.

Таким образом за полчаса удалось вычистить то, что внушало ужас при первом взгляде.

Может быть, конечно, есть способ попроще, но я пошла путем наименьшего сопротивления :)

Нравится

Поделиться

4 комментария

использую чуть-чуть расширенный запрос

declare @citynew uniqueidentifier = ''
declare @cityold varchar(30) = ''
 
UPDATE [Terrasoft].[dbo].[tbl_Account]
	SET [CityID] = @citynew
	WHERE [CityID] in (
		SELECT [ID]
		FROM [Terrasoft].[dbo].[tbl_City]
		where [name] like @cityold)
 
UPDATE [Terrasoft].[dbo].[tbl_AccountAddress]
	SET [CityID] = @citynew
	WHERE [CityID] in (
		SELECT [ID]
		FROM [Terrasoft].[dbo].[tbl_City]
		where [name] like @cityold)
 
UPDATE [Terrasoft].[dbo].[tbl_Contact]
	SET [CityID] = @citynew
	WHERE [CityID] in (
		SELECT [ID]
		FROM [Terrasoft].[dbo].[tbl_City]
		where [name] like @cityold)
 
UPDATE [Terrasoft].[dbo].[tbl_ContactAddress]
	SET [CityID] = @citynew
	WHERE [CityID] in (
		SELECT [ID]
		FROM [Terrasoft].[dbo].[tbl_City]
		where [name] like @cityold)

Кроме запроса наверное вариантов нет...
Вообще такое встречается постоянно, и проверка на совпадения или стандартизация справочников адресных просится

"просто Алексей" написал:использую чуть-чуть расширенный запрос

Класс! :) Не догадалась, ручками инфу подставляла )) Что ж Вы раньше-то молчали? Я ж тут полкоммьюнити перерыла, пока не сдалась и не пошла своим путем )))

думал давно известный прием
но коль так, предложу на суд общественности еще один свой запрос, который выставляет страны и регионы, если в карточке указан только город, а в справочнике городов есть информация о стране и регионе (регион можно и убрать из запроса)

UPDATE [Terrasoft].[dbo].[tbl_Account]
   SET [Terrasoft].[dbo].[tbl_Account].[StateID] =  (
 SELECT [StateID]
  FROM [Terrasoft].[dbo].[tbl_City]
  where (not [Terrasoft].[dbo].[tbl_City].[StateID] is null) and (not [Terrasoft].[dbo].[tbl_City].[CountryID] is null)
  and ([Terrasoft].[dbo].[tbl_City].[ID] = [Terrasoft].[dbo].[tbl_Account].[CityID])
  )
 
      ,[Terrasoft].[dbo].[tbl_Account].[CountryID] =  (
 SELECT [CountryID]
  FROM [Terrasoft].[dbo].[tbl_City]
  where (not [Terrasoft].[dbo].[tbl_City].[StateID] is null) and (not [Terrasoft].[dbo].[tbl_City].[CountryID] is null)
  and ([Terrasoft].[dbo].[tbl_City].[ID] = [Terrasoft].[dbo].[tbl_Account].[CityID])
  )
 
 WHERE [Terrasoft].[dbo].[tbl_Account].[CityID] in 
 (
 SELECT [ID]
  FROM [Terrasoft].[dbo].[tbl_City]
  where (not [Terrasoft].[dbo].[tbl_City].[StateID] is null) and (not [Terrasoft].[dbo].[tbl_City].[CountryID] is null)
  )
GO

надеюсь кому-то окажется полезным

Показать все комментарии