обновление подобных полей в SQL-сервере

Существует ли способ искать поля, которые содержат подобные значения в 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, чтобы сделать.

1
задан Abe Miessler 3 August 2010 в 14:00
поделиться

2 ответа

Как насчет:

 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)

Это может сократить время выполнения и улучшить соединения

1
ответ дан 2 September 2019 в 22:29
поделиться

Во-первых, я не понимаю, как ваши два запроса могут возвращать разные результаты. В обоих случаях требуется, чтобы 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
1
ответ дан 2 September 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: