我有一個名為“ROSTER”的表,在這個表中我有 22 列。
我想查詢和比較該特定表的任何 2 行,目的是檢查這 2 行的每一列的值是否完全相同。ID 列在每一行中總是有不同的值,所以我不會包括 ID 列進行比較。我將僅使用它來指代將用于比較的行。
如果所有列值都相同:要么不顯示任何內容(我更喜歡這個),要么按原樣回傳 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
uj5u.com熱心網友回復:
請根據 John Cappelletti 的想法嘗試以下解決方案。所有的功勞都歸功于他。
查詢陳述句
-- 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];
輸出
----------- ----------- -------- -------------- --------------
| source_id | target_id | column | source_Value | target_Value |
----------- ----------- -------- -------------- --------------
| 1 | 2 | TIME | 0900 | 0801 |
----------- ----------- -------- -------------- --------------
uj5u.com熱心網友回復:
這里的一般方法可能是僅聚合整個表并報告計數狀態:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365092.html
標籤:sql sql-server 查询语句
