Eğer sütun değerleri tam olarak aynı ise (farklı İD ile kontrol hem) & iki satır karşılaştırın. Tüm satırlar ve sütunlar aynı tabloda

0

Soru

"LİSTE" adlı bir tablom var ve bu tabloda 22 sütun var.

Her bir sütunun bu 2 satırdaki değerlerinin tam olarak aynı olup olmadığını kontrol etmek amacıyla, söz konusu tablonun 2 satırını sorgulamak ve karşılaştırmak istiyorum. Kimlik sütununun her satırda her zaman farklı değerleri vardır, bu nedenle karşılaştırma için kimlik sütununu eklemeyeceğim. Karşılaştırma için hangi satırların kullanılacağını belirtmek için kullanacağım.

Tüm sütun değerleri aynıysa: Ya sadece hiçbir şey göstermeyin (bunu tercih ederim) ya da sadece 2 satırı olduğu gibi döndürün.

Aynı olmayan bazı sütun değerleri varsa: Yalnızca bu sütun adlarını görüntüleyin veya hem sütun adını hem de değerini görüntüleyin (bunu tercih ederim).

Örnek:

LİSTE Tablosu:

KİMLİK isim zaman
1 N1 0900
2 N1 0801

Çıktı:

KİMLİK zaman
1 0900
2 0801

veya

Ekran "ZAMAN"

Not: Aslında, 2 satırın aynı olmadığını bildiğim sürece herhangi bir sonuç veya çıktı yolu ile iyiyim.

SQL Server'da bunu yapmanın olası yolları nelerdir?

Microsoft SQL Server Management Studio 18, Microsoft SQL Server 2019-15.0.2080.9 kullanıyorum

sql sql-server tsql
2021-11-24 03:55:43
1

En iyi cevabı

3

Lütfen John Cappelletti'nin fikirlerine dayanarak aşağıdaki çözümü deneyin. Tüm övgüler ona ait.

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

Çıktı

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

Bunu kontrol etmeye çalışıyordum ve [anahtar] kısımdan oldukça kafam karıştı. Bu 'anahtarın' ne olduğunu ve bunun nasıl tanımlanması veya kullanılması gerektiğini bilebilir miyim?
Lars

{key] json'un bir parçasıdır. (1) Anahtar, (2) değer ve (3) tür, üçü de JSON tarafından otomatik olarak oluşturulur. Buradan kontrol edin: bertwagner.com/posts/the-ultimate-sql-server-json-cheat-sheet
Yitzhak Khabinsky

Diğer dillerde

Bu sayfa diğer dillerde

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