Porovnat dva řádky (oba s různými ID) a zkontrolovat, jestli jejich hodnoty sloupců jsou stejné. Všechny řádky a sloupce jsou v téže tabulce

0

Otázka

Mám tabulku s názvem "SEZNAM" a v této tabulce mám 22 sloupců.

Chci, aby dotaz a porovnejte 2 řádky dané tabulky s cílem zkontrolovat, zda každý sloupec má hodnoty, že 2 řádky jsou stejné. Sloupec ID má vždy různé hodnoty v každém řádku, tak jsem se nezahrnuje sloupec ID pro porovnání. Budu jen používat to, aby odkazovat na to, co řádky budou použity pro srovnání.

Pokud jsou všechny hodnoty sloupců jsou stejné: Buď jen zobrazovat nic (tenhle se mi líbí nejvíc), nebo jen návrat do 2 řádků, jak to je.

Pokud jsou některé hodnoty sloupce nejsou stejné: Buď zobrazit sloupec názvy nebo zobrazit název sloupce a jeho hodnota (tahle se mi líbí víc).

Příklad:

SOUPISKA Tabulky:

ID JMÉNO ČAS
1 N1 0900
2 N1 0801

Výstup:

ID ČAS
1 0900
2 0801

NEBO

Zobrazení "ČAS"

Poznámka: ve Skutečnosti jsem v pohodě s tím, co výsledek nebo způsob, jak výstup tak dlouho, jak můžu vědět, v žádném případě, že 2 řádky nejsou stejné.

Jaké jsou možné způsoby, jak to udělat v SQL Server?

Jsem pomocí 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

Nejlepší odpověď

3

Prosím, zkuste následující řešení založené na myšlenkách Johna Cappelletti. Všechny úvěry jde k němu.

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

Snažil jsem se na to podívat a docela zmaten [key] část. Mohu vědět, co je to "klíč" a jak by to mělo být definováno nebo použít?
Lars

{key] je součástí JSON. (1) Klíč, (2) hodnota, a (3) typ, všechny tři z nich jsou automaticky generovány JSON. Podívejte se sem: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

V jiných jazycích

Tato stránka je v jiných jazycích

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