Porównaj dwa wiersze (obie z różnymi identyfikatorami) i sprawdź, czy pasują do siebie czy ich wartości kolumn. Wszystkie wiersze i kolumny są w jednej tabeli

0

Pytanie

Mam tabela o nazwie "REJESTR", i w tej tabeli mam 22 kolumny.

Chcę zamówić i porównać dowolne 2 wiersze tej konkretnej tabeli, aby sprawdzić, czy pasują do siebie czy wartości każdej kolumny w tych 2 wierszach. Kolumna identyfikatora zawsze ma różne wartości w każdym wierszu, więc nie będę zawierać kolumnę identyfikator dla porównania. Ja po prostu będę go używać do oznaczenia, jakie linie będą wykorzystywane do porównania.

Jeśli wszystkie wartości kolumn są takie same: albo po prostu nic nie wyświetlaj (wolę ten wariant), albo po prostu zwrócić na 2 wiersze, jak jest.

Jeśli niektóre wartości kolumn nie są takie same: albo wyświetl tylko te nazwy kolumn, albo wyświetl jako nazwa kolumny, jak i jego wartość (wolę ten wariant).

Przykład:

Tabela REJESTRU:

ID Nazwa czas
1 N1 0900
2 N1 0801

Wyjście:

ID czas
1 0900
2 0801

lub

Wyświetlacz "CZAS"

Uwaga: faktycznie, zgadzam się z każdym wynikiem lub sposobem wyjścia, jeśli mogę w jakikolwiek sposób wiedzieć, co 2 wiersze nie są takie same.

Jakie są możliwe sposoby, aby to zrobić w programie SQL Server?

Używam 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

Najlepsza odpowiedź

3

Proszę, spróbuj zastosować następne rozwiązanie, oparte na pomysłach Johna Cappelletti. Cała zasługa należy do niego.

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

Wyjście

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

Próbowałem to sprawdzić i był zupełnie zdezorientowany [klucz] częścią. Mogę wiedzieć, co to był za "klucz" i jak go należy określić lub użyć?
Lars

{klucz] jest częścią JSON. (1) Klucz (2) wartość i (3) rodzaj, wszystkie trzy z nich są generowane automatycznie JSON. Sprawdź tutaj: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

W innych językach

Ta strona jest w innych językach

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