2017-05-10 4 views
0

같은 두 개의 테이블이 있습니다 가정 :T는-SQL은 부분적으로 문단에 등장하는 기록을 찾기

표가 :

ID ___ 내용

(11) ___ 애플 아이폰은 훌륭한 전자 장치입니다 .

12 삼성 갤럭시는 우수한 기능을 제공합니다.

표 2 :

ID ___ 제목 노키아 3310 리퍼브

71___

72___ 브랜드의 새로운 아이폰

내가 만들려는 6

73___ 알카텔 T-전화 Table1 (11과 같음)에서 ID를 받고 레코드를 반환하는 쿼리 s의 내용 열 Table1 (여기 : 72)을 포함하는 Table2에서 가져옵니다.

전체 텍스트를 사용하도록 설정했으나 효과적이고 빠른 방법으로 쿼리를 만들었지 만 시작할 수있는 단서도 찾지 못했습니다. WHILE을 통해 문장을 구문 분석하거나 분할하는 것을 피하면서이 문제를 해결할 올바른 방법이 있어야한다고 생각합니다.

도움을 주셔서 감사 드리며 추가 설명이 필요한 경우 알려 주시기 바랍니다.

+0

간단한 선택 또는 절차에서이 작업을 수행 하시겠습니까? – Whencesoever

+0

@Whencesoever 절차. – Farshid

+0

@Whencesoever 여러 행이나 명령문에 걸쳐 있으면 정상입니다. – Farshid

답변

1

해결책을 찾았습니다. 가장 빠르거나 가장 깨끗한 것은 아니지만 작동하는 것 같습니다. 나는 단어 분리기로 ''(공간)을 사용하기로 결정했다. 단순히 Exec prc과 함께 표 1에서 ID를 선택합니다 끝에

CREATE PROCEDURE prc 

AS 
BEGIN 

    SET NOCOUNT ON; 
    declare @TEMP table (IDTable1 int, IDTable2 int) 


     DECLARE @etd TABLE 
     (
      words nvarchar(max) 
     ) 


     declare @idtable1 int, @Content nvarchar(max), @word nvarchar(max) 

     declare k cursor local forward_only for select [ID] 
     ,[Content] from Table1 

     OPEN k; 
FETCH NEXT FROM k INTO @idtable1 , @Content 
WHILE @@FETCH_STATUS=0 
    BEGIN 


     delete from @etd 

     insert into @etd (words) 
     select * from dbo.f_SplitVarchar(@Content,' ') 

     declare k1 cursor local forward_only for select words from @etd 

      OPEN k1; 
    FETCH NEXT FROM k1 INTO @word 
    WHILE @@FETCH_STATUS=0 
     BEGIN 


     insert into @TEMP select @idtable1, ID from Table2 where ' ' + title + ' ' like '% ' + @word + ' %' 


     FETCH NEXT FROM k1 INTO @word 
     END 

     close k1 
     deallocate k1 



     FETCH NEXT FROM k INTO @idtable1 , @Content 
     END 

     close k 
     deallocate k 
    select * from @TEMP 
END 
GO 

: 그런 다음 우리의 데이터를 가져 오기 위해 사용

CREATE FUNCTION [dbo].[f_SplitVarchar] 
    (
     @RowData NVARCHAR(MAX) , 
     @SplitOn NVARCHAR(5) 
    ) 
RETURNS @ReturnValue TABLE (Data NVARCHAR(MAX)) 
AS 
    BEGIN 
     DECLARE @Counter INT 
     SET @Counter = 1 
     WHILE (CHARINDEX(@SplitOn, @RowData) > 0) 
      BEGIN 
       INSERT INTO @ReturnValue 
         (data 
         ) 
         SELECT Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, 
                  CHARINDEX(@SplitOn, 
                   @RowData) - 1))) 
       SET @RowData = SUBSTRING(@RowData, 
            CHARINDEX(@SplitOn, @RowData) + 1, 
            LEN(@RowData)) 
      SET @Counter = @Counter + 1 
     END 
    INSERT INTO @ReturnValue 
      (data) 
      SELECT Data = LTRIM(RTRIM(@RowData)) 
    RETURN 
END; 

을 :

먼저 우리는 단어에 텍스트를 분할 분할 기능을 작성해야 첫 번째 표의 단어가 포함 된 표 2의 ID 더 이상 도움이 필요하거나 아무것도 이해하지 못하면 =).

+0

대단히 감사합니다. 작업 솔루션! – Farshid