Compare as duas linhas (ambos com ID diferente) & verifique se os seus valores de coluna são exatamente os mesmos. Todas as linhas e colunas da mesma tabela

0

Pergunta

Eu tenho uma tabela chamada "lista de inscritos" e no quadro eu tenho 22 colunas.

Eu deseja consultar e comparar as 2 linhas da tabela particular com a finalidade de verificar se cada coluna de valores do que 2 linhas são exatamente os mesmos. ID coluna sempre tem valores diferentes em cada linha, de modo que eu não incluem o ID de coluna para a comparação. Eu só vou usá-lo para se referir ao que linhas serão utilizados para a comparação.

Se todos os valores da coluna são o mesmo: Quer apenas mostrar nada (eu prefiro este) ou apenas devolver os 2 linhas como ele é.

Se há alguns valores da coluna não é o mesmo: mostrar os nomes de coluna ou apenas exibir o nome da coluna e o seu valor (prefiro este).

Exemplo:

Lista de inscritos Tabela:

ID NOME HORÁRIO
1 N1 0900
2 N1 0801

Saída:

ID HORÁRIO
1 0900
2 0801

OU

Exibição de "TEMPO"

Nota: na Verdade, eu estou bem com qualquer resultado ou caminho de saída, contanto que eu possa saber de forma alguma que as 2 linhas não são o mesmo.

Quais são os caminhos possíveis para fazer isso no SQL Server?

Eu estou usando o 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

Melhor resposta

3

Por favor, tente a seguinte solução baseado nas ideias de John Cappelletti. Todo o crédito vai para ele.

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

Saída

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

Eu estava tentando verificar isso e muito confuso com a [chave] parte. Gostaria de saber o que era esse 'chave' e como isso deve ser definido ou usar?
Lars

{key] é uma parte do JSON. (1) Chave (2) valor e (3) tipo, todos os três deles são geradas automaticamente pelo JSON. Confira aqui: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

Em outros idiomas

Esta página está em outros idiomas

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