2017-05-10 2 views
0

Supposons qu'il y ait deux tables comme:T-SQL Rechercher des enregistrements qui sont partiellement publiés dans un paragraphe

Tableau 1:

ID ___ Contenu

11 ___ Apple iPhone est un appareil électronique .

12 ___ Samsung Galaxy offre de bonnes capacités.

Tableau 2:

ID ___ Titre

71___ Remis à neuf Nokia 3310

72___ Marque-New iPhone 6

73___ Alcatel T-Phone

Je veux créer une requête qui reçoit un ID de Table1 (comme 11) et renvoie l'enregistrement s de Table2 qui contient des mots de la colonne Content de Table1 (ici: 72).

J'ai activé le Full-Text et bien que trop pour trouver un moyen efficace et rapide de créer la requête, mais je n'ai même pas trouvé d'indice pour commencer. J'évitais d'analyser des phrases avec des mots via WHILE ou de les séparer et je pense qu'il doit y avoir une bonne façon de gérer cela.

Merci pour votre aide et s'il vous plaît laissez-moi savoir si des précisions supplémentaires sont nécessaires.

+0

vous voulez faire cela en sélection simple ou procédure? – Whencesoever

+0

@Whenchaque procédure. – Farshid

+0

@Whencesoever C'est OK si elle s'étend sur plusieurs lignes ou instructions. – Farshid

Répondre

1

J'ai trouvé une solution. Ce n'est peut-être pas le plus rapide ou le plus propre, mais on dirait que ça fonctionne. J'ai décidé d'utiliser '' (espace) comme séparateur de mots.

Tout d'abord, nous devons créer fonction split qui divise le texte en mots:

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; 

utiliser ensuite pour obtenir nos données:

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 

A la fin simplement Exec prc sélectionneront ID de table1 ID de la table 2 contenant les mots de la première table. Si vous avez besoin d'aide ou si vous ne comprenez rien, demandez simplement =).

+0

Merci beaucoup. Solution de travail! – Farshid