Announcement

Collapse
No announcement yet.

Zwei Listen vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zwei Listen vergleichen

    Hallo zusammen!

    Ich muss innerhalb meines Programmes zwei Listen mithilfe von MSSQL vergleichen. Dabei habe ich eine Große-Mapping-Tabelle, in der in etwa so etwas drinsteht:

    Code:
    A_ID | B_ID
    ------------
    1    | 1
    1    | 2
    2    | 1
    2    | 2

    In diesem Fall wären die Listen A=1 und B=2 identisch. Ich möchte nun identische Listen herausfinden. Mein erster Ansatz war anhand von CHECKSUM_AGG zu vergleichen:

    SELECT A_ID, CHECKSUM_AGG(B_ID) AS ChkSum FROM BeispielTabelle GROUP BY A_ID

    Dabei kommt nun in diesem trivialen Beispiel das folgende heraus:

    Code:
    A_ID | ChkSum
    --------------
    1    | 3
    2    | 3
    Ich habe also beide Listen verglichen und herausgefunden, dass beide gleich sind. Problem gelöst - könnte man meinen. Allerdings ist die CHECKSUM_AGG() Funktion nicht zuverlässig genug. Ich habe es (dummerweise) geschafft, zwei Listen zu erstellen, die unterschiedlich sind, aber identische Ergebnisse bei der CHECKSUM_AGG() Funktion haben.

    Die MSSQL-Hilfe erklärt mir hierzu: "Wenn sich einer der Werte in der Liste mit Ausdrücken ändert, ändert sich gewöhnlich auch die Prüfsumme der Liste. Es besteht jedoch eine geringe Möglichkeit, dass sich die Prüfsumme nicht ändert. Aus diesem Grund wird nicht empfohlen, CHECKSUM für die Überprüfung auf geänderte Werte zu verwenden, außer es spielt für die Anwendung keine große Rolle, wenn gelegentlich eine Änderung nicht erkannt wird. Möglicherweise sollten Sie stattdessen HashBytes verwenden. Wenn ein MD5-Hashalgorithmus angegeben wird, ist die Wahrscheinlichkeit, dass HashBytes für zwei verschiedene Eingaben dasselbe Ergebnis zurückgibt, wesentlich geringer als bei CHECKSUM."

    Soweit so gut, nun würde ich also gerne HashByte() anstelle von CHECKSUM() verwenden. Allerdings habe ich ja nicht genau einen Wert, sondern eine Liste von Werten. Also benötige ich eine Aggregatfunktion die für 2 verschiedene Listen sicher zwei verschiedene Ergebnisse herausbringt (eine Gödelisierung). Daher meine Fragen:

    - Kennt jemand eine Gödelisierungsfunktion die bereits in MSSQL enthalten ist?
    - Kennt jemand eine Stored Procedure die eine Gödelisierung in MSSQL vornimmt, die frei verwendbar ist?
    - Gibt es für HashByte() ebenfalls eine aggregierte Funktion? (so wie CHECKSUM_AGG() für CHECKSUM() - nur eben für HashByte())

    Vielen Dank für eure Hilfe!

  • #2
    Hallo,

    der "Umweg" über die Checksumme bzw. den Hashwert ist nicht notwendig, wenn die Tabelle über einen Alias gleich 2 Mal abgefragt wird:

    [highlight=SQL]
    USE tempdb
    GO

    CREATE TABLE dbo.TestTbl
    (
    id INT NOT NULL IDENTITY PRIMARY KEY,
    a_id INT NOT NULL,
    b_id INT NOT NULL
    )
    GO
    INSERT INTO dbo.TestTbl (a_id, b_id) VALUES (1,1)
    INSERT INTO dbo.TestTbl (a_id, b_id) VALUES (1,2)
    INSERT INTO dbo.TestTbl (a_id, b_id) VALUES (2,1)
    INSERT INTO dbo.TestTbl (a_id, b_id) VALUES (2,2)
    GO

    SELECT a.id, a.a_id, b.b_id
    FROM dbo.TestTbl a, dbo.TestTbl b
    WHERE (a.a_id = a.b_id) AND (b.a_id = b.b_id) AND (a.a_id = b.b_id)
    [/highlight]

    Comment

    Working...
    X