Compara două rânduri (ambele cu ID diferit) si verifica daca coloana lor valorile sunt exact la fel. Toate rânduri și coloane sunt în același tabel

0

Problema

Am un tabel numit "REGISTRU" și în acest tabel am 22 de coloane.

Vreau pentru a interoga și de a compara oricare 2 rânduri de masa respectivă cu scopul de a verifica dacă fiecare coloană de valori din care 2 rânduri sunt exact la fel. ID coloana are întotdeauna valori diferite în fiecare rând, așa că am nu va include ID-ul de coloană pentru compararea. Voi folosi doar pentru a se referi la ce randuri vor fi utilizate pentru comparație.

Dacă toate valorile din coloane sunt aceleași: Fie doar afișa nimic (eu o prefer pe asta) sau doar se întoarcă 2 randuri ca este.

Dacă există unele coloană valorile nu același lucru: Fie a afișa aceste nume de coloană sau afișa nume de coloană și valoarea sa (eu o prefer pe asta).

Exemplu:

LISTĂ Tabel:

ID NUMELE TIMP
1 N1 Ora 09: 00
2 N1 0801

Ieșire:

ID TIMP
1 Ora 09: 00
2 0801

SAU

Display "TIMP"

Notă: de Fapt, eu sunt de acord cu orice rezultat sau o cale de ieșire, cât de mult pot ști în orice fel încât cele 2 rânduri nu sunt la fel.

Care sunt posibilele modalități de a face acest lucru în SQL Server?

Eu sunt, folosind 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

Cel mai bun răspuns

3

Vă rugăm să încercați următoarele soluții bazate pe ideile lui John Cappelletti. Toate de credit merge la el.

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

Ieșire

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

Am fost încercarea de a verifica acest lucru și destul de confuz de [cheie] parte. Pot să știu de ce a fost această "cheie" și cum ar trebui să fie definite sau de a folosi?
Lars

{cheie] este o parte a JSON. (1), Tasta (2) valoarea, și (3) de tip, toate cele trei dintre ele sunt generate automat de JSON. Verifica-l aici: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

În alte limbi

Această pagină este în alte limbi

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