2010-08-03 2 views
1

SQL 데이터베이스에서 비슷한 값을 포함하는 필드를 검색하는 방법이 있습니까? 예를 들어 하나의 열에 URL 값이 들어 있고 백만 개의 열과 연결된 백만 개가 넘는 테이블이 있습니다. 다음과 같이 SQL 서버에서 유사한 필드 업데이트

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

가 그럼 난 등의 단어를 사용하는 쿼리를 변경 :

은 국가에 null 값을 포함 경우 다음을 사용하여 업데이트 할 수 있었다으로 이전에 나는 동일한 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 문을 사용하여 URL이 어디에있는 레코드를 찾았는지 결과가 표시되지만 업데이트가 작동하지 않습니다.

  • http://www.pantagraph.com/news
    • http://www.pantagraph.com
    • http://pantagraph.com
    • 모두 같은 도메인 URL을하고 각자가 방지하기 위해 난 그냥 국가 열을 업데이트하려면 다음과 같이 더 좋은 예입니다 할 일은 약 200000이므로 수동으로 수행해야합니다.

    +0

    왜 두 라인 : t1.url ON = t2.url WHERE t2.url 같은 t1.url; ? 또한 LIKE는 조인과 다른 결과 세트를 제공합니다. SET 문에 문제가 될 수 있습니다. 귀하의 회신에 감사드립니다. – Tobiasopdenbrouw

    +0

    . 그래서 다음과 같이 나는 조금 변경 시도 : 업데이트 T1 SET의 t1.country = t2.country 을 이 t2.url 처럼 t1.url ON T2 AS 소스를 가입 T1 AS 소스와 꽤 긴 시간이 소요되었다 나는 그것을 취소했다. 이 방법이 효과가 있습니까, 아니면 더 좋은 제안이 있습니까? – vbNewbie

    답변

    1

    방법에 대해 :

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

    참조 당신이 당신의 데이터 세트에 ... 너무 많은 나쁜 경기를 할 수 있음을 실행할 때 얻을 조인의 종류.

    어떤 시점에서는 URL의 정확한 부분을 기반으로 일부 일치를 수행해야하지만이 같은 쿼리에서는 어떻게 수행해야할지 모릅니다. 정보를 원하시면이 링크를 참조하십시오 : 모든 URL이 http://www를 포함

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

    아, 그리고합니다. 부분 당신은 항상 당신의 실행 시간을 줄일 수

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

    그런 짓을하고 enfore 수있는 더 나은

    +0

    나는 그것을 다시 시도 할 것이다. 위의 설명에서 언급했듯이 오랜 시간이 걸렸습니다. 조금 참을성이있어. 다시 게시 할 것입니다. 응답과 링크에 감사드립니다. – vbNewbie

    +0

    국가 레코드가 Null인지 여부를 확인하고있는 곳은 어디입니까? t1에서 t2로 국가 데이터를 가져 오려는 경우 처리 시간을 줄이기 위해 t2.country가 NULL로 설정되어 있지 않은 이유는 무엇입니까? 당신은 단지 NULL 레코드를 수정하고 싶습니까? – Albert

    +0

    오른쪽 .. 저에게 그것을 추가하십시오. – vbNewbie

    1

    먼저 조인, 당신의 두 쿼리가 다른 결과를 반환 할 수있는 방법을 볼 수 없습니다. 두 경우 모두 Url이 정확히 ON 절에 일치해야합니다.

    두 번째로 URL이 동일하지만 나라가 다른 Sources 테이블에 두 개의 행이있는 경우 어떻게됩니까? 이것은 UPDATE 문에서 FROM 절을 사용하는 데주의해야하는 이유 중 하나이며 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 + '%') 
            ) 
    

    편집

    을, 당신은 NULL 국가 값을 갖는 행을 업데이트하고 싶다고 암시했다. 그게 사실이라면, 그것은 WHERE 절의 사소한 또한 필요

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