Объединение таблиц со значениями, которые не совпадают - PullRequest
0 голосов
/ 24 января 2012

У меня есть две таблицы, подобные этой:

Сводная таблица

ID int
CityName Varchar(200)
PopulationCount int

Таблица данных

ID int
CityName Varchar(200)
PopulationCount int
Longitude float
Latitude float

Сводная таблица содержит 800 строк, а DataTable содержит 800 000 строк. Каждое название CityName в сводной таблице содержится в таблице данных как минимум один раз (и довольно часто несколько раз). Мне нужно создать новую таблицу для хранения каждого из 800 городов из сводной таблицы и их соответствующих широт / долгот из таблицы данных.

Проблема в том, что поле CityName в сводной таблице не точно соответствует CityName в таблице данных. Есть небольшие различия.

   Sample Data: 
   Summary Table, CityName: Yarmouth (N.S.)
   Data Table, CityName: Yarmouth

Шаблон в приведенных выше примерах данных не всегда верен, т. Е. Разница не всегда в скобках, поэтому я не вижу регулярных выражений и т. Д. Я полагаю, что функции метода empty () или «% CityName%» могут работать, но я не знаю, как правильно их реализовать.

Любая помощь будет принята с благодарностью ...

Ответы [ 2 ]

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

Я не уверен, что это будет лучшим подходом, но, учитывая, что это одноразовая работа, как вы подтвердили в комментарии, я обязательно попробую следующее:

  1. Создайте промежуточную таблицу CityNames с такими столбцами:

    • StateCode (код вашего штата),

    • CityNameVariant,

    • CityNameProper.

  2. Заполните первые два столбца всеми различными комбинациями StateCode и CityName найдено в обеих исходных таблицах.

  3. Используя серию ручных обновлений, заполните столбец CityNameProper именами, удаленными из различных не относящихся к делу частей, таких как (N.S.) или , N.S.и т.д., чтобы получить одно унифицированное имя, соответствующее его различным версиям, для каждого города.Таким образом, таблица будет содержать строки, подобные этой:

    StateCode  CityNameVariant  CityNameProper
    ---------  ---------------  --------------
    NS         Yarmouth (N.S.)  Yarmouth
    NS         Yarmouth         Yarmouth
    NS         Yarmouth, N.S.   Yarmouth
    

    Операторы обновления могут выглядеть следующим образом:

    UPDATE CityNames
    SET CityNameProper = SUBSTRING(
      CityNameVariant,
      1,
      CHARINDEX('(', CityNameVariant)
    )
    WHERE CityNameVariant LIKE '% (%)'
    ;
    UPDATE CityNames
    SET CityNameProper = SUBSTRING(
      CityNameVariant,
      1,
      CHARINDEX(',', CityNameVariant)
    )
    WHERE CityNameVariant LIKE '%, %'
    ;
    UPDATE CityNames
    SET CityNameProper = SUBSTRING(CityNameVariant, …, …)
    WHERE CityNameVariant LIKE '…'
    ;
    
  4. Окончательный запрос, соответствующий двум исходным таблицам, будетвыглядит примерно так:

    WITH joined AS (
      SELECT
        s.StateCode,
        s.CityName,
        d.PopulationCount,
        d.Longitude,
        d.Latitude,
        rnk = ROW_NUMBER() OVER (
          PARTITION BY s.StateCode, s.CityName
          ORDER BY d.Population  /* or maybe ‘BY Longitude, Latitude’
                                    or ‘BY (SELECT 1)’, it may not matter
                                    but in any event it's up to you */
        )
      FROM Summary s
        INNER JOIN CityNames c ON s.StateCode = c.StateCode
                              AND s.CityName  = c.CityNameVariant
        INNER JOIN Data d      ON d.StateCode = c.StateCode
                              AND d.CityName  = c.CotyNameProper
    )
    --INSERT INTO SummaryWithData
    SELECT
      StateCode,
      CityName,
      PopulationCount,
      Longitude,
      Latitude
    FROM joined
    WHERE rnk = 1
    

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

0 голосов
/ 24 января 2012

Использование «как» выглядело бы примерно так:

select * 
from Summary s
     join Data d on (s.CityName like '%' + d.CityName + '%') or (d.CityName like '%' + s.CityName + '%')

Но, как вы сказали, это может не охватить все

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