比较两行(均具有不同的 ID)并检查它们的列值是否完全相同。所有行和列都在同一个表中

Lar*_*ars 2 sql t-sql sql-server

我有一个名为“ROSTER”的表,该表中有 22 列。

我想查询并比较该特定表的任意 2 行,目的是检查该 2 行的每列值是否完全相同。ID 列在每行中始终具有不同的值,因此我不会包含 ID 列进行比较。我将仅用它来指代将使用哪些行进行比较。

如果所有列值都相同:要么不显示任何内容(我更喜欢这个),要么按原样返回 2 行。

如果有一些列值不相同:要么仅显示这些列名称,要么同时显示列名称及其值(我更喜欢这个)。

例子:

名单表:

ID 姓名 时间
1 N1 0900
2 N1 0801

输出:

ID 时间
1 0900
2 0801

或者

显示“时间”

注意:实际上,只要我能以任何方式知道两行不相同,我就可以接受任何结果或输出方式。

在 SQL Server 中执行此操作的可能方法有哪些?

我正在使用 Microsoft SQL Server Management Studio 18、Microsoft SQL Server 2019-15.0.2080.9

Yit*_*sky 5

请根据 John Cappelletti 的想法尝试以下解决方案。所有功劳都归于他。

SQL

-- DDL and sample data population, start
DECLARE @roster TABLE (ID INT PRIMARY KEY, NAME VARCHAR(10), TIME CHAR(4));
INSERT 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];
Run Code Online (Sandbox Code Playgroud)

输出

+-----------+-----------+--------+--------------+--------------+
| source_id | target_id | column | source_Value | target_Value |
+-----------+-----------+--------+--------------+--------------+
|         1 |         2 | TIME   |         0900 |         0801 |
+-----------+-----------+--------+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)