none
FULLTEXT INDEX, CONSULTA CON CONTAINS E INNER JOIN RRS feed

  • Pregunta

  • Hola! Necesito ayuda con una consulta que estoy tratando de desarrollar. La misma es en MS SQL SERVER 2016 sobre una tabla que tiene un FULL TEXT INDEX ya que debe buscar un string en un texto. 

    El poblema que tengo es que ese string a buscar, lo tengo en otra tabla y la única forma de unirlas es por ese campo. 

    La consulta que estaría necesitando, seria algo así:

    SELECT T1.VALOR, T2.TEXTO
    FROM TABLA_1 T1 inner join  TABLA_2 T2 ON  CONTAINS(T2.TEXTO,T1.VALOR)

    Pero esto no funciona. La sentencia CONTAINS no me permite poner como parámetro un campo de otra tabla. 

    Hay alguna forma de que pueda hacer esto sin necesidad de recurrir a un cursor? 

    Desde ya, muchas gracias. 

    jueves, 31 de octubre de 2019 15:27

Respuestas

  • Bien, pues entonces habrá que probar con CROSS APPLY. Es algo parecido a esto:

    SELECT T1.VALOR, T2.TEXTO
     FROM TABLA_1 AS T1
     CROSS APPLY (Select TABLA_2.Texto FROM TABLA_2 Where CONTAINS(TABLA_2.TEXTO,T1.VALOR)) as T2
    

    Ten presente que el rendimiento no será muy alto porque esto ejecuta la query del contains por cada valor que devuelva la T1.

    jueves, 31 de octubre de 2019 19:32

Todas las respuestas

  • Creo que podría funcionar mediante un Join de la primera tabla con una subconsulta correlacionada que filtre la segunda tabla usando el CONTAINS. Más o menos algo parecido a lo siguiente, pero habrá que probarlo, no sé si el Parser será capaz de establecer la correlación sobre el argumento del Contains:

    SELECT T1.VALOR, T2.TEXTO
     FROM TABLA_1 AS T1
     INNER JOIN (Select TABLA_2.Texto Where CONTAINS(TABLA_2.TEXTO,T1.VALOR)) as T2 ON T1.TEXTO=T2.TEXTO

    Si así no funciona, me temo que habrá que recurrir a usar CROSS APPLY.

    jueves, 31 de octubre de 2019 17:21
  • Gracias por responder, pero no funciona. Traté de solucionar los errores que da, pero sigue existiendo el problema de que la sentencia CONTAINS no me permite hacer referencia a un campo de otra tabla en el segundo parámetro:

    CONTAINS(TABLA_2.TEXTO,T1.VALOR))

    jueves, 31 de octubre de 2019 18:04
  • Bien, pues entonces habrá que probar con CROSS APPLY. Es algo parecido a esto:

    SELECT T1.VALOR, T2.TEXTO
     FROM TABLA_1 AS T1
     CROSS APPLY (Select TABLA_2.Texto FROM TABLA_2 Where CONTAINS(TABLA_2.TEXTO,T1.VALOR)) as T2
    

    Ten presente que el rendimiento no será muy alto porque esto ejecuta la query del contains por cada valor que devuelva la T1.

    jueves, 31 de octubre de 2019 19:32