2010-08-10 2 views
2

SQL Server에서 두 테이블을 비교하는 데 문제가 있습니다.SQL Server : 두 테이블을 비교하는 방법

첫 번째 테이블 [Table1]에는 내 콘텐츠가 저장되는 텍스트 열이 있고 두 번째 테이블 [table2]에는 내 키워드 열이 있습니다.

이제 모든 키워드를 내 콘텐츠와 비교하고 콘텐츠의 발생 횟수가 키워드 목록에 표시되도록하고 싶습니다. (충분히 클리어?)

+2

전체 텍스트 검색을 사용 하시겠습니까? –

+1

우선 SQL Server 2005 이상에서 TEXT 열을 삭제하고 대신 VARCHAR (MAX) (또는 NVARCHAR (MAX))를 사용하십시오. –

+0

키워드는 NAVCHAR (255) 열에 저장되지만 ntext의 콘텐츠는 변경할 수 없습니다. 질의를 한 번만 실행합니다. SEO 사람에게이 데이터가 필요합니다. – giker

답변

0

이것은 ntext 필드에있는 Table2의 키 woards (kwd nvarchar (255))를 사용하여 Table1 (id int, txt ntext)의 ID 목록을 반환합니다. 어커런스의 수는 까다로 우며이를 얻으려면 UDF (선호하는 CLR 1)를 작성해야합니다.

단어를 공백으로 구분하거나 왼쪽과 공백으로 괄호를 닫거나 오른쪽으로 괄호 안의 쉼표, 점 또는 세미콜론을 모두 구분하여 정의했습니다. 따옴표, 큰 따옴표 등 더 많은 조건을 추가 할 수 있습니다.

Select Table1.id, Table2.kwd 
    From Table1 
Cross Join Table2 
Where patindex(N'%[ (]'+Table2.kwd+N'[ ,.;)]%',N' '+cast(Table1.txt as nvarchar(max))+N' ')>0 
Order by id, kwd 
+0

및 각 키워드의 발생 횟수를 얻는 방법은 무엇입니까? –

+0

이것은 내 데이터베이스를 죽이고 있습니다 - 상위 10 개의 실행 시간이 9 분에 도달했습니다. "나는 공백으로 구분 된 모든 것으로 단어를 정의했거나 왼쪽과 공백으로 괄호를 엽니 다." 그러나 모든 키워드는 표 2 – giker

+0

키워드와 텍스트 테이블 간 교차 결합을 수행해야하므로 무거운 쿼리입니다. 또한 속도의 챔피언이 아닌 patindex 기능을 수행해야합니다. 내가 "단어를 ...로 정의했다"는 말은 단어가 공백 구분, 쉼표 구분, 탭 구분 또는 인쇄 된 텍스트의 단어의 일반적인 의미인지 여부를 모르기 때문에 어떻게 ntext 필드에서 단어를 정의합니까? 분리 문자의 조합을 가질 수 있습니다. 어쨌든 Martin Smith (아래)가 제안한 SQL 2008 사용 솔루션을 사용하는 경우에도 많은 리소스가 필요합니다. – Niikola

2

어떤 버전의 SQL Server입니까? SQL2008 당신이

WITH Table1 AS 
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL 
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL 
SELECT 3, N'red lorry yellow lorry' UNION ALL 
SELECT 4, N'the quick brown fox jumped over the lazy dog' 
), 
Table2 AS 
(
SELECT 'lorry' as keyword UNION ALL 
SELECT 'yellow' as keyword UNION ALL 
SELECT 'brown' as keyword 
) 

SELECT Table1.id,display_term, COUNT(*) As Cnt 
FROM Table1 
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0) 
JOIN Table2 t2 ON t2.keyword=display_term 
WHERE TXT IS NOT NULL 
GROUP BY Table1.id,display_term 
ORDER BY Cnt DESC 

반환 (아마도 nvarchar(max) 텍스트에서 캐스팅 후) 할 수 있다면

id   display_term     Cnt 
----------- ------------------------------ ----------- 
3   lorry       2 
3   yellow       1 
4   brown       1 
1   brown       1 
+0

와우, 나는 sys.dm_fts_parser 함수를 놓쳤다. 그리고 그것은 훌륭하다. – Niikola

+0

고마워,하지만 그것을 실행할 수 없다. 내가 받고있어 : "대체 데이터 형식의 인수 ntext가"함수의 교체 1에 유효하지 않습니다. " – giker

+0

바꾸기 기능에 'cast (YourColumnName as nvarchar (max))'를 전달하십시오 –

관련 문제