es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resultados de coincidencia en tabla SQL donde no están en el mismo orden que la tabla unida.

Tengo dos tablas, ambas con una gran cantidad de datos. He tomado una fila de cada tabla para proporcionar este ejemplo.

Necesito hacer coincidir cualquier registro de usuario en la Tabla 1 con la Tabla 2 donde las especialidades coinciden.

No puedo usar una cláusula IN, porque mis resultados necesitan coincidir EXACTAMENTE lo que está en la columna ‘specialties’ de la tabla 1 con ‘specialties’ en la Tabla 2.

El problema es que en la Tabla 2, el orden de las especialidades no coincide con el de las especialidades en la Tabla 1.

Querría que el userID = 1 de la Tabla 1 coincida con esta fila en la Tabla 2 porque tienen las mismas especialidades. ¿Alguien tiene alguna idea de cómo puedo hacer que estos datos coincidan?

Tabla 1:


seleccionar
userID
,especialidades
de tabla1
donde userID = 1

userID especialidades
1 Agua y Medio Ambiente, Entorno Construido, Inundaciones y Riesgos Hidrológicos, Civil y Ambiental, Especialistas, Medio Ambiente

Tabla 2:

especialidades
Entorno Construido, Agua y Medio Ambiente, Civil y Ambiental, Medio Ambiente, Especialistas, Inundaciones y Riesgos Hidrológicos
Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución para hacer coincidir las especialidades de la Tabla 1 con la Tabla 2 incluso si el orden es diferente consiste en utilizar la función STRING_SPLIT en SQL Server 2016. Aquí hay una consulta de ejemplo basada en los datos proporcionados:

    SELECT t1.userID
    FROM table1 t1
    INNER JOIN (
        SELECT specialties, STRING_AGG(value, ',') WITHIN GROUP (ORDER BY (SELECT NULL)) AS specialties_sorted
        FROM table2
        CROSS APPLY STRING_SPLIT(specialties, ',')
        GROUP BY specialties
    ) t2
    ON t2.specialties_sorted = (
        SELECT STRING_AGG(value, ',') WITHIN GROUP (ORDER BY (SELECT NULL))
        FROM STRING_SPLIT(t1.specialties, ',')
    )
    

    Esta consulta creará una tabla temporal (t2) que contiene la lista ordenada de especialidades de la Tabla 2, utilizando la función STRING_SPLIT para dividir los valores separados por comas en filas y luego agregándolos de nuevo en una cadena con el mismo orden para cada grupo de especialidades. La sintaxis WITHIN GROUP (ORDER BY (SELECT NULL)) se utiliza para ordenar los valores alfabéticamente dentro de cada grupo (es decir, cada valor original de especialidades de la Tabla 2).

    Luego, la consulta principal unirá la Tabla 1 (t1) a esta tabla temporal (t2) utilizando la columna specialties_sorted como criterio de coincidencia. Esto se hace dividiendo la columna specialties de la Tabla 1 de la misma manera y comparando su versión ordenada con la de la Tabla 2.

    Tenga en cuenta que esta consulta asume que no hay especialidades duplicadas dentro de cada fila de ambas tablas. Si ese no es el caso, es posible que necesite utilizar un método diferente para manejar los duplicados. Además, si la columna specialties puede contener comillas u otros caracteres especiales, es posible que deba escaparlos correctamente o utilizar un delimitador diferente para la agregación de cadenas.

Comments are closed.