簡體   English   中英

比較表中的行以了解字段之間的差異

[英]Comparing rows in table for differences between fields

我有一個包含20多個列的表(客戶端),大部分都是歷史數據。

像這樣的東西:id | clientID | field1 | field2 | etc ... | updateDate

如果我的數據如下所示:

10|12|A|A|...|2009-03-01
    11|12|A|B|...|2009-04-01
    19|12|C|B|...|2009-05-01
    21|14|X|Y|...|2009-06-11
    27|14|X|Z|...|2009-07-01

有沒有一種簡單的方法可以比較每一行並突出顯示字段之間的差異? 我需要能夠簡單地突出顯示各修訂版本之間更改的字段(密鑰和課程日期除外)

每個新行中可能有多個更新的字段(或只有一個)。

這將在每個客戶端的基礎上進行,因此我可以選擇clientID進行過濾。

它可以在服務器或客戶端,這是最簡單的。

更多詳細信息,我應該稍微擴展一下描述:我只是想看看這些字段之間是否存在差異(一個字段在任何方面都不同)。 一些數據是數字,一些是文本,其他是日期。 一個更完整的示例可能是:

10|12|A|A|F|G|H|I|J|...|2009-03-01
    11|12|A|B|F|G|H|I|J|...|2009-04-01
    19|12|C|B|F|G|Z|I|J|...|2009-05-01 ***
    21|14|X|Y|L|M|N|O|P|...|2009-06-11
    27|14|X|Z|L|M|N|O|P|...|2009-07-01

我希望能夠播放clientID 12的每一行,並突出顯示第11行的B和第19行的C&Z。

SQL中的任何表達式都只能引用一行中的列(禁止子查詢)。

可以使用JOIN將兩個不同的行變成結果集的一行。

因此,您可以通過自聯接比較不同行上的值。 這是一個示例,該示例顯示將每一行連接到與同一客戶端相關聯的每隔一行(不包括將一行連接到自身)。

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)

現在,您可以編寫比較列的表達式。 例如,將上述查詢限制為field1不同的查詢:

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;

您無需指定需要進行哪種比較,因此我將其留給您。 關鍵點是,通常,您可以使用自聯接比較給定表中的行。


關於您的評論和說明:好的,因此,您的“差異”不僅是按值,而是按行的順序位置。 請記住,關系數據庫沒有行號的概念,它們僅具有相對於您必須在ORDER BY子句中指定的某些順序的行順序。 不要將“ id ”偽鍵與行號混淆,僅通過實現它們的巧合將數字分配為單調遞增。

在MySQL中,您可以利用用戶定義的變量來實現所需的效果。 clientId然后按id clientId查詢,並跟蹤MySQL用戶變量中每列的值。 當當前行中的值與變量中的值不同時,請執行突出顯示操作。 我將顯示一個字段的示例:

SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
  IF(@clientid <> clientid, 
    ((@clientid := clientid) AND (@field1 := field1)) = NULL,
    IF (@field1 <> field1, 
      (@field1 := field1), 
      NULL
    )
  ) AS field1_changed
FROM client c
ORDER BY clientId, id;

請注意,此解決方案與僅使用普通SQL選擇所有行並在獲取行時使用應用程序變量跟蹤值並沒有什么不同。

暫無
暫無

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

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