2010-10-19 11 views
6

se si fa un join che assomiglia a questo esclusa partite su ISCRIVITI campi che sono nulli

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

C'è un modo per non permettere NULLS per abbinare simili ai risultati di questa interrogazione restituirebbe

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 

EDIT

012.351.

In realtà ho fatto la domanda sbagliata .... Fammi riprovare.

Stiamo confrontando un nuovo dato con dati vecchi e cercando record in cui le righe sono esattamente le stesse.

Così entrambe le tabelle definite:

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

Se faccio la domanda:

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

Dare

T1 & T2 

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

Questo non sarebbe rimuovere il record duplicato 1000 dal T1 dal Dati2 è NULLO.

Al di fuori di utilizzare un valore magico nel join, c'è un altro modo per confrontare questi?

Capisco che dovrei fare in modo che i consulenti riscrivano il codice per inserire tutti i NULLS come "", ma a questo punto è un'impresa enorme. Sto anche osservando l'hashing della fila per cercare le differenze.

risposta

3

provare a utilizzare questo:

SET ANSI_NULLS ON 

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

EDIT

unendosi con "numeri magici" come:

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

è il migliore che si può fare nella vostra situazione, e molto probabilmente compromettere significativamente le prestazioni della query. Direi che il vero problema è di progettazione, unirsi a NULL è semplicemente strano per me.

+0

destro. Avrei dovuto ricordarmelo. Occasionalmente dobbiamo anche confrontare NULL = NULL.Poiché SET ANSI_NULLS OFF alla fine causerà un errore, è possibile eseguire il confronto senza utilizzare ISNULL (T1.Field1, '-9999') = ISNULL (T2.Field2, '-9999') –

4

avete considerato in qualche modo il laboriose

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) 
       ) 
+0

non essere sorpreso se l'ottimizzatore preferirebbe le condizioni di cui sopra nella clausola WHERE ... (eccetto T1.Key1 = T2.Key2) +1 – Unreason

0

risposte di Conrad e KM di realizzare il vostro compito, ma nessuno è molto pulito. Il motivo principale è che SQL con l'introduzione di NULL ha consentito il supporto per la logica a tre valori in cui NULL non è uguale NULL (operatore =).

Il tuo caso è uno dei motivi per cui NULL controversi e si può leggere un po 'di logica interessante su NULL a cominciare wikipedia

+0

too Codd non ascoltato Date –

+0

@Conrad Frix, d'accordo, ma ancora se quello era il più grande problema concettuale degli R'DBMS di oggi, saremmo stati in buona forma ... – Unreason