Сравните две строки (обе с разными идентификаторами) и проверьте, совпадают ли значения их столбцов. Все строки и столбцы находятся в одной таблице

0

Вопрос

У меня есть таблица с именем "РЕЕСТР", и в этой таблице у меня 22 столбца.

Я хочу запросить и сравнить любые 2 строки этой конкретной таблицы, чтобы проверить, совпадают ли значения каждого столбца в этих 2 строках. Столбец идентификатора всегда имеет разные значения в каждой строке, поэтому я не буду включать столбец идентификатора для сравнения. Я просто буду использовать его для обозначения того, какие строки будут использоваться для сравнения.

Если все значения столбцов одинаковы: либо просто ничего не отображайте (я предпочитаю этот вариант), либо просто верните 2 строки как есть.

Если некоторые значения столбцов не совпадают: либо отобразите только эти имена столбцов, либо отобразите как имя столбца, так и его значение (я предпочитаю этот вариант).

Пример:

Таблица РЕЕСТРА:

ID Имя время
1 N1 0900
2 N1 0801

Выход:

ID время
1 0900
2 0801

или

Дисплей "ВРЕМЯ"

Примечание: На самом деле я согласен с любым результатом или способом вывода, если я могу каким-либо образом знать, что 2 строки не совпадают.

Каковы возможные способы сделать это в SQL Server?

Я использую 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

Лучший ответ

3

Пожалуйста, попробуйте следующее решение, основанное на идеях Джона Каппеллетти. Вся заслуга принадлежит ему.

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

Выход

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

Я пытался проверить это и был совершенно сбит с толку [ключевой] частью. Могу я узнать, что это был за "ключ" и как его следует определять или использовать?
Lars

{ключ] является частью JSON. (1) Ключ, (2) значение и (3) тип, все три из них автоматически генерируются JSON. Проверьте это здесь: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

На других языках

Эта страница на других языках

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