none
Buscando todo el contenido de los registros de una tabla en otra tabla en cada uno de sus registro en diferentes campos contenido. RRS feed

  • Pregunta

  • Buenos días.

    Tengo dos tablas:

        Una tabla llamada BuscandoTexto con 2 campos [ID] numeric identity(1,1), y [texto] varchar(50)

        Una tabla llamada Persona con muchos campos, pero me interesan estos 3 campos:

                  [nombre] varchar(50) 

                  [apellidos] varchar(50) 

                  [alias] varchar(50) 

    El objetivo obtener los registros de la tabla Personas donde se compara en los campos nombre, apellidos y alias si en ellos contiene el texto de cada uno de los registros que aparece en la tabla BuscandoTexto entonces muestra el registro, pero cada uno de los registros que hay en BuscandoTexto debe de estar contenido en alguno de los campos del registro que pertenezca a la tabla Personas

    Es decir:

    Si tengo en la tabla: Personas

    nombre		apellidos	alias
    ----------------------------------------
    NOMBRE 1	Perez Martin	NULL
    Mario		APELLIDO 2	NULL
    NOMBRE 3	APELLIDO 3	Risas
    Isabel		APELLIDO 4	NULL
    NOMBRE 5	APELLIDO 5	NULL

    Si tengo en la tabla BuscandoTexto

    Declare @BuscandoTexto Table ([Texto] varchar (50));
    insert into @BuscandoTexto ([Texto]) values ('ere');
    insert into @BuscandoTexto ([Texto]) values ('ario');
    insert into @BuscandoTexto ([Texto]) values ('isa');

    Como no hay ningún registro donde este contenido: ere y ario y isa.

              No mostrará nada

    Si tengo en la tabla BuscandoTexto

    Declare @BuscandoTexto Table ([Texto] varchar (50));
    insert into @BuscandoTexto ([Texto]) values ('llid');
    insert into @BuscandoTexto ([Texto]) values ('isa');

    Si que hay registros y me mostrará:

    nombre		apellidos	alias
    ----------------------------------------
    NOMBRE 3	APELLIDO 3	Risas
    Isabel		APELLIDO 4	NULL

    Aquí si devuelve porque en el

    1º registro devuelto alias encuentra Isa y en apellidos encuentra llid

    2º registro devuelto en nombre encuentra Isa y apellidos encuentro llid

    Como ya indico todo el contenido de los registros de la tabla BuscandoTexto tiene que encontrarse en los campos

    Pudiendo ocurrir que si el siguiente caso:

    Declare @BuscandoTexto Table ([Texto] varchar (50));
    insert into @BuscandoTexto ([Texto]) values ('Ar');
    insert into @BuscandoTexto ([Texto]) values ('rio');

    Encontraría

    nombre		apellidos	alias
    ----------------------------------------
    Mario		APELLIDO 2	NULL
    1º registro devuelto nombre encuentra ar y en nombre encuentra rio

    No se como hacerlo para que sea eficiente y rápido.

    Muchas gracias.

    • Editado El dubitativo sábado, 24 de marzo de 2018 16:23 Eliminado texto excedente
    sábado, 24 de marzo de 2018 16:19

Respuestas

  • Intenta con la siguiente consulta sql:

    -- Test data
    DECLARE @Personas table (nombre varchar(50), apellidos varchar(50), alias varchar(50));
    DECLARE @BuscandoTexto table ([texto] varchar (50));
    INSERT INTO @Personas VALUES
    ('Nombre-1', 'Perez Martin', NULL),
    ('Mario', 'Apellido-2', NULL),
    ('Nombre-3', 'Apellido-3', 'Risas'),
    ('Isabel', 'Apellido-4', NULL),
    ('Nombre-5', 'Apellido-5', NULL);
    INSERT INTO @BuscandoTexto values ('Ar'), ('rio');
    
    -- Query
    SELECT t.FullName
    FROM 
    	@Personas p 
    	CROSS APPLY(SELECT CONCAT(p.nombre, ' ', p.apellidos, ' ', p.alias)) t(FullName)
    	INNER JOIN @BuscandoTexto b ON t.FullName LIKE '%' + b.texto + '%'
    GROUP BY t.FullName
    HAVING COUNT(DISTINCT b.Texto) = (SELECT COUNT(*) FROM @BuscandoTexto);
    GO

    • Propuesto como respuesta Pablo RubioModerator sábado, 24 de marzo de 2018 23:08
    • Marcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 9:11
    • Desmarcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 9:44
    • Marcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 10:35
    sábado, 24 de marzo de 2018 21:32

Todas las respuestas

  • Intenta con la siguiente consulta sql:

    -- Test data
    DECLARE @Personas table (nombre varchar(50), apellidos varchar(50), alias varchar(50));
    DECLARE @BuscandoTexto table ([texto] varchar (50));
    INSERT INTO @Personas VALUES
    ('Nombre-1', 'Perez Martin', NULL),
    ('Mario', 'Apellido-2', NULL),
    ('Nombre-3', 'Apellido-3', 'Risas'),
    ('Isabel', 'Apellido-4', NULL),
    ('Nombre-5', 'Apellido-5', NULL);
    INSERT INTO @BuscandoTexto values ('Ar'), ('rio');
    
    -- Query
    SELECT t.FullName
    FROM 
    	@Personas p 
    	CROSS APPLY(SELECT CONCAT(p.nombre, ' ', p.apellidos, ' ', p.alias)) t(FullName)
    	INNER JOIN @BuscandoTexto b ON t.FullName LIKE '%' + b.texto + '%'
    GROUP BY t.FullName
    HAVING COUNT(DISTINCT b.Texto) = (SELECT COUNT(*) FROM @BuscandoTexto);
    GO

    • Propuesto como respuesta Pablo RubioModerator sábado, 24 de marzo de 2018 23:08
    • Marcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 9:11
    • Desmarcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 9:44
    • Marcado como respuesta El dubitativo miércoles, 28 de marzo de 2018 10:35
    sábado, 24 de marzo de 2018 21:32
  • Antes de que me indicarás esa respuesta lo pasé de 2:24 a 0:06 y ahora con tu respuesta tarda 0:01 con las colecciones más largas.

    Muchas gracias :)

    miércoles, 28 de marzo de 2018 9:11