Ver Mensaje Individual
  #5 (permalink)  
Antiguo 29/02/2008, 00:07
Avatar de Beakdan
Beakdan
 
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Re: Registros que no estan en otro tabla

Rinnegan:
¿Por qué prefieres la vieja sintaxis? Es muy proclive a los errores sobretodo en los outer joins. En tu consulta tienes una completa contradiccion:
Código:
WHERE DOM.Id_dominio = LU.Id_dominio 
AND DOM.Id_dominio NOT IN (SELECT Id_dominio FROM eMailF_Leidos_Unicos)
Es una contradiccion porque sintacticamente el NOT IN es equivalente a poner una serie de condiciones con <>. Por lo tanto tu query no devolverá nada ya que equivale a decir que DOM.Id_dominio = eMailF_Leidos_Unicos.Id_dominio y ademas DOM.Id_dominio es distinto de cada un de los valores devueltos por el subquery que trae los valores de eMailF_Leidos_Unicos.

Gabo77: Normalmente el exists y not exists son la elección acertada para discriminar rapidamente valores entre dos conjuntos, pero aquí hay también un error. En el query original de artcevise una de las condiciones de sus joins es:
Código:
eMailF_FechasLectura AS FL ON FL.id_leido_unico = LU.id_leido_unico 
Sin embargo tu not exists tiene una condición completamente diferente:
Código:
And Not Exists(
        Select 1
        From eMailF_FechasLectura FL
        Where D.Id_Dominio = FL.Id_Dominio 
El query dentro de la condición not exists debe ser el join de las dos tablas con los registros que quiere excluir:
Código:
SELECT        D.Id_Dominio,
            COUNT(D.Id_Dominio) AS Suma
FROM        EMailF_Dominios AS D
WHERE        NOT EXISTS(
                SELECT        1
                FROM        eMailF_Leidos_Unicos AS LU
                INNER JOIN    eMailF_FechasLectura AS FL 
                            ON FL.id_leido_unico = LU.id_leido_unico
                WHERE        D.Id_Dominio = LU.id_dominio
            )
GROUP BY    D.Id_Dominio
ORDER BY    suma
A partir del query original un simple cambio en el tipo de join resuelve el problema:
Código:
SELECT        DOM.Id_dominio,
            COUNT(DOM.id_dominio) suma
FROM        eMailF_Dominios AS DOM
LEFT JOIN    eMailF_Leidos_Unicos AS LU 
            INNER JOIN    eMailF_FechasLectura AS FL
                        ON FL.id_leido_unico = LU.id_leido_unico
            ON DOM.id_dominio = LU.id_dominio
WHERE        LU.id_dominio IS NULL
GROUP BY    DOM.id_dominio
ORDER BY    suma
Sin ambargo, sin conocer más sobre los índices de las tablas, me inclinaría por el query con NOT EXISTS.