2010-10-19 17 views
6

si lo hace una combinación que se parece a esto Excluyendo los partidos en campos de unión que son nulas

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

¿Hay una manera de no permitir que NULLS para que coincida similar a los resultados de esta consulta devolvería

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

De hecho, hice la pregunta equivocada ... Déjame intentarlo de nuevo.

Estamos comparando datos nuevos con datos antiguos y buscando registros donde las filas son exactamente iguales.

Así ambas tablas definidas:

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

Si hago la consulta:

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

Dale

T1 & T2 

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

Esto no sería eliminar el registro duplicado 1000 de T1 ya Dato2 es NULO.

Fuera de hacer uso de un valor mágico en la unión, ¿hay alguna otra manera de compararlos?

Entiendo que debería hacer que los consultores reescriban el código para insertar todos los NULLS como '', pero esta es una gran empresa en este momento. También estoy buscando hash la fila para buscar diferencias.

Respuesta

3

tratar de usar esto:

SET ANSI_NULLS ON 

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

EDITAR

unirse con los "números mágicos" como:

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

es lo mejor que puede hacer en su situación, y lo más probable dañar el rendimiento de la consulta significativamente. Diría que el verdadero problema es el diseño, unirme a NULLs es simplemente extraño para mí.

+0

derecho. Deberia haber recordado eso. Ocasionalmente también tenemos que comparar NULL = NULL.Como SET ANSI_NULLS OFF eventualmente causará un error, ¿hay alguna forma de hacer la comparación sin usar ISNULL (T1.Field1, '-9999') = ISNULL (T2.Field2, '-9999') –

4

¿Usted ha considerado los algo laborioso

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

no lo haría? se sorprenderá si el optimizador prefiere que las condiciones anteriores estén en la cláusula WHERE ... (excepto T1.Key1 = T2.Key2) +1 – Unreason

0

respuestas KM de Conrad y de lograr su tarea, pero ninguno es muy limpio. La razón principal es que el SQL con la introducción de NULL admitió la lógica de tres valores donde NULL no es igual a NULL (operador =).

Su caso es uno de los motivos por los nulos son polémicos y se puede leer alguna razón interesante sobre los nulos a partir de wikipedia

+0

, demasiado mal Codd no escuchó la Fecha –

+0

@Conrad Frix, estuvo de acuerdo, pero aún así ese era el mayor problema conceptual de los R'DBMS de hoy en día estaríamos en muy buena forma ... – Unreason

Cuestiones relacionadas