6 Stimmen

Ausschluss von Übereinstimmungen bei JOIN-Feldern, die NULL sind

Wenn Sie eine Verknüpfung durchführen, die wie folgt aussieht

~~SELECT T1.KeyField1, T1.KeyField2, T2.Field3 FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2

Gibt es eine Möglichkeit, NULLS nicht zuzulassen, ähnlich wie bei den Ergebnissen, die diese Abfrage zurückgeben würde

SELECT T1.KeyField1, T1.KeyField2, T2.Field3
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2
               AND T1.KeyField2 IS NOT NULL AND T2.KeyField2 IS NOT NULL~~ 

EDITAR

Ich habe die Frage eigentlich falsch gestellt.... Lassen Sie es mich noch einmal versuchen.

Wir vergleichen neue Daten mit alten Daten und suchen nach Datensätzen, bei denen die Zeilen genau gleich sind.

Also beide Tabellen definiert:

CREATE TABLE [Table](
    [Identifier] [int] IDENTITY(1,1) NOT NULL,
    [Key1] [varchar](50) NOT NULL,
    [Data1] [varchar](50) NULL,
    [Data2] [varchar](50) NULL

Wenn ich die Abfrage mache:

DELETE
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
               AND T1.Data1 = T2.Data2 AND T1.Data2 = T2.Data2

Geben Sie

T1 & T2

| Key1 | Data1       | Data2   |
| 1000 | 123 Main St | <NULL>  |
| 1001 | 456 High St | FLOOR 2 |

Dies würde den doppelten Datensatz 1000 aus T1 nicht entfernen, da Data2 NULL ist.

Gibt es, abgesehen von der Verwendung eines magischen Werts in der Verknüpfung, eine andere Möglichkeit, diese zu vergleichen?

Mir ist klar, dass ich die Berater dazu bringen sollte, den Code so umzuschreiben, dass alle NULLS als '' eingefügt werden, aber das ist an dieser Stelle ein großes Unterfangen. Ich überlege auch, die Zeile zu hashen, um nach Unterschieden zu suchen.

4voto

Conrad Frix Punkte 50686

Haben Sie an die etwas mühsame

DELETE
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
               AND 
               (T1.Data1 = T2.Data1
                OR 
                   (T1.Data1 is Null AND T2.data1 is Null)
               )
               AND
               (T1.Data2 = T2.Data2
                OR 
                   (T1.Data2 is Null AND T2.Data2 is Null)
               )

3voto

KM. Punkte 98297

Versuchen Sie dies:

SET ANSI_NULLS ON

http://msdn.microsoft.com/en-us/library/aa259229(SQL.80).aspx

EDITAR

Verbindung mit "magischen Zahlen" wie:

ISNULL(T1.Field1, '-9999') = ISNULL(T2.Field2, '-9999') 

ist das Beste, was Sie in Ihrer Situation tun können, und wird höchstwahrscheinlich die Abfrageleistung erheblich beeinträchtigen. Ich würde sagen, das eigentliche Problem ist ein Design ein, Beitritt auf NULLs ist einfach nur seltsam für mich.

0voto

Unreason Punkte 12300

Die Antworten von Conrad und KM erfüllen Ihre Aufgabe, aber keine ist sehr sauber. Der Hauptgrund ist, dass SQL mit der Einführung von NULLs die Unterstützung von drei Wertlogiken erlaubt, bei denen NULL nicht gleich NULL ist (Operator = ).

Ihr Fall ist einer der Gründe, warum NULLs umstritten sind, und Sie können einige interessante Argumente zu NULLs lesen, beginnend mit wikipedia

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X