2010-08-03 18 views
1

有沒有辦法在sql db中搜索包含相似值的字段? 例如,我有一個超過一百萬條記錄,其中一列包含url值並與國家/地區列關聯。以前我試圖匹配相等網址,它包含爲國家空值作爲能夠使用下列來更新它:更新sql服務器中的類似字段

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; 

當我只是使用select語句來查找urls是什麼樣的記錄然後我得到的結果,但更新不起作用。 一個更好的例子如下:

這些都是同一個域的網址,我只是想更新全國列各一個,以避免手動做,因爲有大約20萬做。

+0

爲什麼兩條線: ON t1.url = t2.url WHERE t1.url像t2.url; ? 此外,一個LIKE會給你一個不同的結果集,而不僅僅是你的連接。這可能是您的SET語句的問題。 – Tobiasopdenbrouw 2010-08-03 13:02:34

+0

感謝您的回覆。所以我試圖改變這一點,如下所示: UPDATE T1 SET t1.country = t2.country 來源爲T1 JOIN來源爲T2 ON t1.url像t2.url ,它正在採取相當長的時間執行,所以我取消了它。這會工作還是你有更好的建議? – vbNewbie 2010-08-03 13:25:58

回答

1

如何:

UPDATE t1 
SET t1.country = t2.country 
FROM Sources AS t1 
JOIN sources AS t2 
ON t1.url LIKE t2.url 

看到什麼樣的,當你運行你的數據集......它可能使太多不好的比賽加入你。

在某些時候,您可能需要根據網址的確切部分進行一些匹配,但是我不知道如何在查詢中這樣做。看到這個鏈接的信息:

http://www.w3schools.com/SQL/sql_wildcards.asp

哦,如果所有網址都包含http://www。部分你總是可以做這樣的事情

WHERE left(t1.url,16) = left(t1.url,16) 

這可能會減少你的執行時間和enfore表示更好的連接

+0

我會再試一次。正如我在上述評論中提到的那樣需要很長時間;有點不耐煩。將回傳。感謝您的回覆和鏈接。 – vbNewbie 2010-08-03 13:27:52

+0

你在哪裏檢查國家記錄是否爲空?如果你試圖從t1到t2拉國家數據,那你爲什麼不把WHERE t2.country IS NULL放在那裏以減少處理時間。你只想修正NULL記錄嗎? – Albert 2010-08-03 13:30:21

+0

right..let我補充一點。 – vbNewbie 2010-08-03 13:35:43

1

首先,我看不出你的兩個查詢可能返回不同的結果。在這兩種情況下,您都要求Url完全匹配ON子句。

其次,如果Sources表中有兩行的網址相同但國家不同,您認爲會發生什麼?這是在UPDATE語句中使用FROM子句時要小心的原因之一(以及ANSI標準沒有正式支持的原因之一)。在具有相同Url但不同國家的兩行的情況下,您需要決定哪一個會贏。讓我們假設最低的排序一個將贏得:

Update Sources 
Set Country = (
        Select Min(T2.Country) 
        From Sources As T2 
        Where T2.Url = Sources.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 + '%') 
        ) 

編輯

在後面的評論,有人暗示你只是想更新NULL值的國行。如果這是真的,它需要一個簡單的另外一個WHERE子句:

Update Sources 
Set Country = (
        Select Min(T2.Country) 
        From Sources As T2 
        Where T2.Url = Sources.Url 
        ) 
Where Country Is Null