varias unir tablas tabla relacionadas misma inner ejemplos consultas consulta sql sql-server design-patterns

tablas - unir dos consultas sql misma tabla



Use una cláusula LIKE en parte de una UNIÓN INTERNA (10)

¿Puedo / debo usar un criterio LIKE como parte de INNER JOIN cuando construyo un procedimiento / consulta almacenado? No estoy seguro de estar preguntando lo correcto, así que déjame explicarte.

Estoy creando un procedimiento que tomará una lista de palabras clave para buscar en una columna que contenga texto. Si estuviera sentado en la consola, lo ejecutaría como tal:

SELECT Id, Name, Description FROM dbo.Card WHERE Description LIKE ''%warrior%'' OR Description LIKE ''%fiend%'' OR Description LIKE ''%damage%''

Pero un truco que recogí un poco para hacer un análisis de lista "fuertemente tipado" en un procedimiento almacenado es analizar la lista en una tabla variable / tabla temporal, convertirla al tipo apropiado y luego hacer una UNIÓN INTERNA contra esa tabla en mi conjunto de resultados final. Esto funciona muy bien cuando se envía una lista de ID enteros al procedimiento. Terminé teniendo una consulta final que se ve así:

SELECT Id, Name, Description FROM dbo.Card INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId

Quiero usar este truco con una lista de cadenas. Pero dado que estoy buscando una palabra clave en particular, voy a utilizar la cláusula LIKE. Entonces, idealmente, creo que mi consulta final se vería así:

SELECT Id, Name, Description FROM dbo.Card INNER JOIN @tblKeyword ON dbo.Card.Description LIKE ''%'' + @tblKeyword.Value + ''%''

¿Es esto posible / recomendado?

¿Hay una mejor manera de hacer algo como esto?

La razón por la que pongo comodines en ambos extremos de la cláusula es porque hay términos "archfiend", "bestia-guerrero", "daño directo" y "daño de batalla" que se usan en los textos de las tarjetas.

Me da la impresión de que, dependiendo del rendimiento, ¿puedo utilizar la consulta que especifiqué o utilizar una búsqueda de palabras clave de texto para realizar la misma tarea?

Aparte de hacer que el servidor haga un índice de texto en los campos en los que quiero buscar texto, ¿hay algo más que deba hacer?


un truco que recogí un poco para hacer un análisis de lista "fuertemente tipado" en un procedimiento almacenado es analizar la lista en una tabla variable / tabla temporal

Creo que lo que podría estar aludiendo aquí es poner las palabras clave para incluir en una tabla y luego usar la división relacional para buscar coincidencias (también podría usar otra tabla para excluir las palabras). Para ver un ejemplo trabajado en SQL, consulte las búsquedas de palabras clave de Joe Celko .


@ Dillie-O
¿Qué tan grande es esta mesa?
¿Cuál es el tipo de datos del campo Descripción?

Si cualquiera de las dos es pequeña, una búsqueda de texto completo será excesiva.

@ Dillie-O
Tal vez no sea la respuesta que estabas buscando, pero yo recomendaría un cambio de esquema ...

esquema propuesto:

create table name( nameID identity / int ,name varchar(50)) create table description( descID identity / int ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values create table nameDescJunc( nameID int ,descID int)

Esto le permitirá usar índices sin tener que implementar una solución de perno, y mantiene sus datos atómicos.

relacionado: Diseño de base de datos SQL recomendado para etiquetas o etiquetado


El rendimiento dependerá del servidor real que utilice, y del esquema de los datos, y de la cantidad de datos. Con las versiones actuales de MS SQL Server, esa consulta debería ejecutarse correctamente (MS SQL Server 7.0 tenía problemas con esa sintaxis, pero se trató en el SP2 ).

¿Has ejecutado ese código a través de un generador de perfiles? Si el rendimiento es lo suficientemente rápido y los datos tienen los índices apropiados en su lugar, debe estar todo listo.


LIKE ''% fiend%'' nunca usará una búsqueda, LIKE ''fiend%'' lo hará. Simplemente una búsqueda comodín no es sargable


Parece que estás buscando una búsqueda de texto completo. ¿Porque quiere consultar un conjunto de palabras clave con la descripción de la tarjeta y encontrar las visitas? ¿Correcto?


Personalmente, lo he hecho antes, y me ha funcionado bien. Los únicos problemas que pude ver son posibles problemas con una columna no indexada, pero creo que tendrías el mismo problema con una cláusula where.

Mi consejo para ti es solo mirar los planes de ejecución entre los dos. Estoy seguro de que será diferente cuál es mejor dependiendo de la situación, al igual que todos los problemas de programación.


Prueba esto

select * from Table_1 a left join Table_2 b on b.type LIKE ''%'' + a.type + ''%''

Esta práctica no es ideal. Usar con precaución.


Prueba esto;

SELECT Id, Name, Description FROM dbo.Card INNER JOIN @tblKeyword ON dbo.Card.Description LIKE ''%'' + CONCAT(CONCAT(''%'',@tblKeyword.Value),''%'') + ''%''


Su primera consulta funcionará pero requerirá una exploración de tabla completa porque se ignorará cualquier índice en esa columna. También deberá hacer SQL dinámico para generar todas sus cláusulas LIKE.

Pruebe una búsqueda de texto completo si utiliza SQL Server o echa un vistazo a una de las implementaciones de Lucene . Joel habló sobre su éxito con él recientemente.


intentalo...

select * from table11 a inner join table2 b on b.id like (select ''%''+a.id+''%'') where a.city=''abc''.

Funciona para mí. :-)