Porovnať dva riadky (obe s rôznymi ID) & skontrolovať, či ich hodnoty stĺpca sú presne rovnaké. Všetky riadky & stĺpce sú v tej istej tabuľke

0

Otázka

Mám tabuľku s názvom "KÁDER" a v tejto tabuľke mám 22 stĺpce.

Chcem vyhľadávať a porovnávať ktorékoľvek 2 riadky, ktoré najmä tabuľku s cieľom skontrolovať, či sa každý stĺpec to hodnoty, ktoré 2 riadky sú presne rovnaké. Stĺpec ID vždy má iné hodnoty v každom riadku, tak som sa nemusia zahŕňať stĺpec ID pre porovnanie. Ja sa len ho použiť, aby sa vzťahuje na to, čo riadkov bude použité na porovnanie.

Ak sú všetky hodnoty stĺpca sú rovnaké: Buď len displej nič (radšej to jedno), alebo len návrat do 2 radov, ako to je.

Ak tam sú niektoré hodnoty stĺpca nie je rovnaký: Buď zobrazovať tieto názvy stĺpcov, alebo len displeji ako názov stĺpca a jeho hodnota (radšej to jedno).

Príklad:

KÁDER Tabuľka:

ID NÁZOV ČAS
1 N1 0900
2 N1 0801

Výstup:

ID ČAS
1 0900
2 0801

ALEBO

Zobrazenie "ČAS"

Poznámka: v Skutočnosti som v poriadku, s akýmkoľvek výsledkom, alebo spôsob výkonu ako dlho, ako môžem vedieť, v žiadnom prípade, že 2 riadky nie sú rovnaké.

Aké sú možné spôsoby, ako robiť to v SQL Server?

Ja používam 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

Najlepšiu odpoveď

3

Prosím, skúste použiť nasledujúce riešenie založené na myšlienkach Ján Cappelletti. Všetky úverové ide do neho.

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

Výstup

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

Skúšal som pozrite sa na to a dosť zmätený tým, ako [key] časť. Môžem vedieť, čo je to "kľúč" a ako by to bolo definované alebo použitie?
Lars

{key] je časť JSON. (1) Tlačidlo (2) hodnota, a (3) druh, všetky tri z nich sú automaticky generované JSON. Pozrite si ho tu: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

V iných jazykoch

Táto stránka je v iných jazykoch

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