Существует ли способ искать поля, которые содержат подобные значения в sql дб? Например, у меня есть таблица более чем миллиона записей, где один столбец содержит значения URL и связан со столбцом страны. Ранее я пытался соответствовать URL, которые равны, где это содержало нулевое значение для страны, как смог обновить его с помощью следующего:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url = t2.url;
Затем я изменил запрос для использования подобного слова следующим образом:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url = t2.url
WHERE t1.url like t2.url;
когда я просто использую избранный оператор для нахождения записей, где URL похожи затем, я получаю результаты, но обновление не работает. Лучший пример следующие:
Они являются всеми одинаковыми доменный URL, и я просто хочу обновить столбец страны для каждого, чтобы не делать его вручную, потому что существуют приблизительно 200 000, чтобы сделать.
Как насчет:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url LIKE t2.url
Посмотрите, какие соединения вы получите, когда запустите это в своем наборе данных ... он может дать слишком много неверных совпадений.
В какой-то момент вам, вероятно, потребуется выполнить какое-то сопоставление на основе точных частей URL-адреса, но я не знаю, как это сделать в таком запросе. См. Информацию по этим ссылкам:
http://www.w3schools.com/SQL/sql_wildcards.asp
Да, и если все URL-адреса содержат http: // www . часть, вы всегда можете сделать что-то вроде
WHERE left(t1.url,16) = left(t1.url,16)
Это может сократить время выполнения и улучшить соединения
Во-первых, я не понимаю, как ваши два запроса могут возвращать разные результаты. В обоих случаях требуется, чтобы URL-адрес точно совпадал в предложении ON.
Во-вторых, как вы думаете, что произойдет, если в таблице Sources
будут две строки с одинаковыми URL-адресами, но с разными странами? Это одна из причин, по которой следует соблюдать осторожность при использовании предложения FROM в операторе UPDATE (и одна из причин, по которой оно официально не поддерживается стандартом ANSI). В случае двух строк с одинаковыми URL-адресами, но разными странами, вам нужно решить, какая из них выиграет. Предположим, что победит самый младший отсортированный:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url = Sources.Url
)
Если вам нужны «похожие» URL-адреса, нам сначала нужно знать, как вы определяете «похожие». Использование LIKE без подстановочного знака фактически аналогично использованию =
. Если вы используете начальный подстановочный знак (например, LIKE ('%' + Url)
), вы в конечном итоге выполните сканирование вашей таблицы с миллионами строк. Однако, если мы используем только завершающий подстановочный знак (например, LIKE (Url + '%')
), тогда SQL все равно может использовать индекс:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url Like ( Sources.Url + '%' )
)
EDIT
В более позднем комментарии на это указывалось что вы хотели только обновить строки с помощью значений NULL Country. Если это так, требуется тривиальное добавление предложения WHERE:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url = Sources.Url
)
Where Country Is Null