Confrontare due righe (sia con ID diverso) e verificare se i loro valori di colonna sono esattamente le stesse. Tutte le righe e colonne si trovano nella stessa tabella

0

Domanda

Ho una tabella di nome "ROSTER" e, in questa tabella, ho 22 colonne.

Voglio query e confrontare le 2 righe di tabella specifica con lo scopo di verificare se ciascuna colonna i valori di che 2 righe sono esattamente le stesse. La colonna ID ha sempre valori diversi in ogni riga, in modo che io non includerà la colonna ID per il confronto. Io la usano solo per vedere che cosa le righe sarà utilizzato per il confronto.

Se tutti i valori di colonna sono le stesse: a visualizzare nulla (io preferisco questa) o di solo ritorno il 2 righe così com'è.

Se ci sono alcuni valori di colonna non è la stessa: O visualizzare i nomi di colonna o solo di visualizzare il nome della colonna e il suo valore (io preferisco questa).

Esempio:

ROSTER Tabella:

ID NOME TEMPO
1 N1 0900
2 N1 0801

Output:

ID TEMPO
1 0900
2 0801

O

Display "TEMPO"

Nota: in Realtà a me va bene qualsiasi risultato o il modo di uscita finchè posso sapere in qualche modo che le 2 righe non sono la stessa cosa.

Quali sono i possibili modi per farlo in SQL Server?

Sto utilizzando 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

Migliore risposta

3

Si prega di provare la soluzione seguente sulla base delle idee di Giovanni Cappelletti. Tutto il merito va a lui.

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];

Uscita

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

Stavo cercando di controllare questo fuori e un po ' confuso dal [chiave] parte. Posso sapere che cosa era questa la "chiave" come dovrebbe essere definito o utilizzare?
Lars

{key] è una parte di JSON. (1) Chiave (2) valore, e (3) tipo di, tutti e tre di loro sono generati automaticamente da JSON. Check it out qui: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

In altre lingue

Questa pagina è in altre lingue

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