簡體   English   中英

比較兩行(都具有不同的 ID)並檢查它們的列值是否完全相同。 所有行和列都在同一個表中

[英]Compare two rows (both with different ID) & check if their column values are exactly the same. All rows & columns are in the same table

我有一個名為“ROSTER”的表,在這個表中我有 22 列。

我想查詢和比較該特定表的任何 2 行,目的是檢查該 2 行的每一列的值是否完全相同。 ID 列在每一行中總是有不同的值,所以我不會包括 ID 列進行比較。 我將只使用它來指代將用於比較的行。

如果所有列值都相同:要么不顯示任何內容(我更喜歡這個),要么只返回 2 行。

如果有一些列值不一樣:要么只顯示那些列名,要么同時顯示列名和它的值(我更喜歡這個)。

例子:

名冊表:

ID 姓名 時間
1 N1 0900
2 N1 0801

Output:

ID 時間
1 0900
2 0801

或者

顯示“時間”

注意:實際上我對 output 的任何結果或方式都可以,只要我能以任何方式知道這兩行不一樣。

在 SQL 服務器中執行此操作的可能方法是什么?

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

請根據 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];

Output

+-----------+-----------+--------+--------------+--------------+
| source_id | target_id | column | source_Value | target_Value |
+-----------+-----------+--------+--------------+--------------+
|         1 |         2 | TIME   |         0900 |         0801 |
+-----------+-----------+--------+--------------+--------------+

此處的一般方法可能是僅匯總整個表並報告計數的 state:

SELECT
    CASE WHEN COUNT(DISTINCT ID) = COUNT(*)   THEN 'Yes' ELSE 'No' END AS [ID same],
    CASE WHEN COUNT(DISTINCT NAME) = COUNT(*) THEN 'Yes' ELSE 'No' END AS [NAME same],
    CASE WHEN COUNT(DISTINCT TIME) = COUNT(*) THEN 'Yes' ELSE 'No' END AS [TIME same]
FROM yourTable;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM