2016-07-09 16 views
2

から各キーワードを比較:は、私は2つのテーブルを持っているテーブルから文字列を比較して、別のテーブル

表1は、文のリストが含まれています

Sentence 
---------------------------------------------------------------- 
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur 

及び表2には、キーワードと重みのリストが含まれています: tblKeyword

表1の各文に対して
Keyword         Weight 
---------------------------------------------------------------- 
dolor sit         1 
elit          3 
foobar          10 

、私が送らで見つけることができ、テーブル2内のすべてのキーワードの重量の合計を取得したいと思いますカーソルを使わずにSQLでこれを行うにはどうすればよいですか?

期待される結果:

Result 
------ 
4 (sum of weight for sentence 1) 
6 (sum of weight for sentence 2) 
... 
+0

期待どおりの結果です。あなたは何も試してみました –

+0

こんにちは、私はちょうどテーブル1の各センテンス内に見つけられるキーワードの数の合計を取得したいと思っています。 – nikademus

+0

体重は相対的である可能性があるので、説明できますか? SOUNDEXは、LIKEとシソーラス、辞書などとの相違点を比較して比較することができます。まず何かをやろうとするか、MSDNを読んで関連する質問をしてください。私たちは結局Google検索ではありません。 –

答えて

1

は、これはあなたが始める必要があります。

SELECT 
    S.sentence 
    , SUM(K.weight) AS total_weight 
FROM Sentence S 
JOIN Keyword K 
    ON CHARINDEX(K.keyword, S.sentence) > 0 
GROUP BY S.sentence 
; 

(申し訳ありません:。。確認するために、SQL ServerインスタンスへのアクセスなしのMySQLを試してみましたCHARINDEXINSTRを置き換え)

調整や詳細が必要な場合はコメントしてください。

+0

ありがとう私はあなたの答えがうまくいくと思う、ちょうどちょっとSQL Server 2014で実行するように変更:CHARINDEXをCHARINDEX(K.キーワード、S.sentence)に変更 – nikademus

+0

@nikademus:ヒントのためにありがとう。見落として申し訳ありません。一定。 – Abecee

+0

いいですね.... – Ajay2707

0

は、理想的には私は、カーソルを推奨していませが、あなたのrequirmentに従って、私が見つけた唯一のオプションは、カーソルがあります。これをチェックしてください:

declare @table1 table (sentences varchar(1000)) 
declare @table2 table (keyword varchar(1000) , weight int) 

insert into @table1 values 
('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua') 
,('Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur') 


insert into @table2 values 
('dolor sit' , 1),('elit' , 3),('foobar' , 10) 

/*Declare temp variable*/ 
declare @tab TABLE (sentSeqno int, result int) --to get final result create temporary table and insert temp data 

declare @keyword varchar(1000), @weight int , @Recordno int = 0 , @sentences varchar(1000); 

/*first cursor for table 1 for iteration of each row*/ 
DECLARE @cursorouter CURSOR ; 
SET @cursorouter = CURSOR FOR select * from @table1 
OPEN @cursorouter 
FETCH NEXT FROM @cursorouter INTO @sentences --FILL IN CURSOR TO LOOP THROUGH 
/* loop first cursor while having data*/ 
WHILE @@FETCH_STATUS = 0 
    BEGIN 

     /*Insert into temp data*/ 
     Set @Recordno = @Recordno + 1 insert into @tab values(@Recordno, 0) 

     /*Second cursor for table 2 to for iteration of each row*/ 
     DECLARE @cursorInner CURSOR ; 
     SET @cursorInner = CURSOR FOR 

     select * from @table2 
     OPEN @cursorInner 
     FETCH NEXT 
     FROM @cursorInner INTO @keyword , @weight --FILL IN CURSOR TO LOOP THROUGH 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
        /*to find the keyword in a sentence, we start loop and whenever found the keyword, we store its weightage*/ 
        Declare @pos int =0 
        Declare @oldpos int = 0 

        select @pos= patindex('%' + @keyword +'%' , @sentences) 
        /*While loop for each keyword found in sentence, we store the weightage into temp table*/ 
        while @pos > 0 and @oldpos <> @pos 
        begin 
         /*update temp data to store result*/ 
         update @tab set result = result+ @weight where sentSeqno = @Recordno 
         Select @oldpos = @pos 
         select @pos=patindex(@sentences,Substring(@keyword,@pos + 1,len(@keyword))) + @pos 
        end 

      FETCH NEXT 
      FROM @cursorInner INTO @keyword , @weight; 
     END 
     CLOSE @cursorInner; 
     DEALLOCATE @cursorInner; 

    FETCH NEXT 
     FROM @cursorouter INTO @sentences; 
    END 
    CLOSE @cursorouter; 
    DEALLOCATE @cursorouter; 

select * from @tab 
+0

こんにちは、ありがとうございます。私も同様のことをしましたが、文章がたくさんあるとき(実際には10000行程度)、パフォーマンスが非常に遅いことがわかりました。私の設定。 XEON E3 1220 v3を使用するSQL Server 2014です。走るのに本当に時間がかかります。 – nikademus

関連する問題