Comparer les deux lignes (à la fois avec des ID différents) et vérifier si leurs valeurs de la colonne sont exactement les mêmes. Toutes les lignes et colonnes sont dans le même tableau

0

La question

J'ai une table nommée "LISTE" et dans ce tableau, j'ai 22 colonnes.

Je veux de la requête et comparer les 2 lignes de la table dans le but de vérifier si chaque colonne, les valeurs de 2 lignes sont exactement les mêmes. ID de la colonne a toujours des valeurs différentes dans chaque ligne, donc je ne vais pas inclure l'ID de la colonne pour la comparaison. Je viens de l'utiliser pour se référer à ce que les lignes seront utilisés pour la comparaison.

Si toutes les valeurs de la colonne sont les mêmes: Soit ne rien afficher (je préfère celui-ci) ou il suffit de retourner les 2 lignes qu'il est.

Si il y a certaines valeurs de la colonne sont pas les mêmes: Soit afficher ces noms de colonne uniquement ou afficher à la fois le nom de la colonne et sa valeur (je préfère celui-ci).

Exemple:

LISTE de la Table:

ID NOM Le TEMPS
1 N1 0900
2 N1 0801

Sortie:

ID Le TEMPS
1 0900
2 0801

OU

Affichage "TEMPS"

Remarque: en Fait, je suis d'accord avec n'importe quel résultat ou de moyen de sortie jusqu'à ce que je sais de toute façon que les 2 lignes ne sont pas les mêmes.

Quelles sont les voies possibles pour ce faire, dans SQL Server?

Je suis l'aide de 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

La meilleure réponse

3

S'il vous plaît essayez la solution suivante sur la base des idées de John Cappelletti. Tout le crédit va à 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];

Sortie

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

J'ai essayé de le vérifier, et assez confus par la touche [] de la partie. Je peux savoir ce qu'était cette "clef" et comment devrait-il être défini ou à utiliser?
Lars

{key] est une partie de JSON. (1), De (2) la valeur, et (3) le type, tous les trois d'entre eux sont générées automatiquement par JSON. Découvrez-le ici: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

Dans d'autres langues

Cette page est dans d'autres langues

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