Comparar dos filas (ambos con diferentes ID) y comprobar si sus valores de columna son exactamente los mismos. Todas las filas y las columnas están en la misma mesa

0

Pregunta

Tengo una tabla llamada "LISTA" y en esta tabla tengo 22 columnas.

Quiero consultar y comparar cualquiera de las 2 filas de esa tabla en particular con el propósito de comprobar si cada uno de los valores de la columna de 2 filas son exactamente los mismos. Columna de ID siempre tiene diferentes valores en cada fila, así que no incluyen el IDENTIFICADOR de la columna para la comparación. Solo voy a utilizar para hacer referencia a lo que las filas será utilizado para la comparación.

Si todos los valores de la columna son los mismos: sólo mostrar nada (yo prefiero esta) o acabo de volver de las 2 filas como es.

Si hay algunos valores de la columna no es la misma: mostrar los nombres de columna sólo o para mostrar el nombre de la columna y su valor (yo prefiero esta).

Ejemplo:

La LISTA de la Tabla:

ID NOMBRE TIEMPO
1 N1 0900
2 N1 0801

Salida:

ID TIEMPO
1 0900
2 0801

O

La pantalla "TIEMPO"

Nota: en Realidad estoy de acuerdo con lo que el resultado o la forma de salida como puedo saber de alguna manera que el 2 filas no son los mismos.

¿Cuáles son las formas posibles de hacer esto en SQL Server?

Yo estoy usando el Microsoft SQL Server Management Studio 18, Microsoft SQL Server 2019-15.0.2080.9

sql sql-server tsql
2021-11-24 03:55:43
1

Mejor respuesta

3

Por favor, intente la siguiente solución basada en las ideas de John Cappelletti. Todo el mérito para él.

SQL

-- DDL and sample data population, start
DECLARE @roster TABLE (ID INT PRIMARY KEY, NAME VARCHAR(10), TIME CHAR(4));
INSERT IGNORE INTO @roster (ID, NAME, TIME) VALUES
(1,'N1','0900'),
(2,'N1','0801')
-- DDL and sample data population, end

DECLARE @source INT = 1
    , @target INT = 2;

SELECT id AS source_id, @target AS target_id
      ,[key] AS [column]
      ,source_Value = MAX( CASE WHEN Src=1 THEN Value END)
      ,target_Value = MAX( CASE WHEN Src=2 THEN Value END)
FROM (
        SELECT Src=1
              ,id 
              ,B.*
         FROM @roster AS A
         CROSS APPLY ( SELECT [Key]
                             ,Value
                       FROM OpenJson( (SELECT A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES)) 
                     ) AS B
        WHERE id=@source
        UNION ALL
        SELECT Src=2
              ,id = @source
              ,B.*
         FROM @roster AS A
         CROSS APPLY ( SELECT [Key]
                             ,Value
                       FROM OpenJson( (SELECT A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES)) 
                     ) AS B
         WHERE id=@target
      ) AS A
GROUP BY id, [key]
HAVING MAX(CASE WHEN Src=1 THEN Value END)
     <> MAX(CASE WHEN Src=2 THEN Value END)
    AND [key] <> 'ID'   -- exclude this PK column
ORDER BY id, [key];

Salida

+-----------+-----------+--------+--------------+--------------+
| source_id | target_id | column | source_Value | target_Value |
+-----------+-----------+--------+--------------+--------------+
|         1 |         2 | TIME   |         0900 |         0801 |
+-----------+-----------+--------+--------------+--------------+
2021-11-24 06:12:31

Yo estaba tratando de comprobar esto y un poco confundida por la tecla [] parte. Se puede saber qué era esto 'clave' y cómo debería ser esta definido o uso?
Lars

{clave] es una parte de JSON. (1), (2) el valor, y (3) el tipo, todos los tres de ellos son generados automáticamente por JSON. Échale un vistazo aquí: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................