Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Registros que no estan en otro tabla

Estas en el tema de Registros que no estan en otro tabla en el foro de SQL Server en Foros del Web. tengo esta consulta que me trae los registros de dominio que estan en las otras 2 tablas, en este caso lo quiero es una consulta ...
  #1 (permalink)  
Antiguo 26/02/2008, 11:06
 
Fecha de Ingreso: enero-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Registros que no estan en otro tabla

tengo esta consulta que me trae los registros de dominio que estan en las otras 2 tablas, en este caso lo quiero es una consulta en donde me salgan los registros de dominio que no estan en las otras 2 tablas, necesitan mas informacion?

SELECT DISTINCT DOM.*
FROM eMailF_Dominios AS DOM
INNER JOIN eMailF_Leidos_Unicos AS LU ON LU.id_dominio = DOM.id_dominio
INNER JOIN eMailF_FechasLectura AS FL ON FL.id_leido_unico = LU.id_leido_unico
ORDER BY DOM.id_dominio
  #2 (permalink)  
Antiguo 26/02/2008, 13:43
 
Fecha de Ingreso: enero-2008
Mensajes: 9
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Registros que no estan en otro tabla

OBTUVE ESTA CONSULTA, PERO SI TIENEN ALGO MAS OPTIMO POR FAVOR DIGANME COMO


SELECT DOM.Id_dominio, COUNT(DOM.id_dominio) suma
FROM eMailF_Dominios AS DOM
INNER JOIN eMailF_Leidos_Unicos AS LU ON DOM.id_dominio = LU.id_dominio
WHERE DOM.id_dominio NOT IN
(
SELECT DOM.id_dominio
FROM eMailF_Dominios AS DOM
INNER JOIN eMailF_Leidos_Unicos AS LU ON LU.id_dominio = DOM.id_dominio
INNER JOIN eMailF_FechasLectura AS FL ON FL.id_leido_unico = LU.id_leido_unico
GROUP BY DOM.id_dominio
)
GROUP BY DOM.id_dominio
ORDER BY (COUNT(DOM.id_dominio))DESC
  #3 (permalink)  
Antiguo 28/02/2008, 06:29
Avatar de Rinnegan  
Fecha de Ingreso: febrero-2008
Mensajes: 11
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Registros que no estan en otro tabla

Creo que puedo ayudarte pero de otra forma.

De partida yo no acostumbro a trabajar con JOINs textuales, me explico
en vez de hacer:

FROM eMailF_Dominios AS DOM
INNER JOIN eMailF_Leidos_Unicos AS LU ON LU.id_dominio = DOM.id_dominio

Yo hago esto

Código:
FROM eMailF_Dominios AS DOM, eMailF_Leidos_Unicos AS LU
WHERE DOM.id_dominio = LU.dominio  '<------ JOIN 
teniendo eso claro el codigo se hace mas sencillo de leer.....comenzare con mi explicacion:

Si tu tienes las tablas de esta forma, la cual es como las entendi.

eMailF_Dominios(Id_dominio)
eMailF_Leidos_Unicos(Id_dominio, Id_Leido_Unico)
eMailF_FechasLectura(Id_Leido_Unico)

*Anote solo las claves.

El codigo seria asi:

Código:
SELECT DOM.Id_dominio
   FROM eMailF_Dominios AS DOM, eMailF_Leidos_Unicos AS LU
   WHERE DOM.Id_dominio = LU.Id_dominio 
AND DOM.Id_dominio NOT IN 
(SELECT Id_dominio
   FROM eMailF_Leidos_Unicos
)
AND LU.Id_Leido_Unico NOT IN
(SELECT Id_Leido_Unico
    FROM eMailF_FechasLectura
);
Creo que eso te deberia funcionar sin problemas si es que las tablas son como las pense.

Espero te sirva.

Bye.
  #4 (permalink)  
Antiguo 28/02/2008, 14:33
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 6 meses
Puntos: 6
Re: Registros que no estan en otro tabla

A ver si te sirve esto:

Código:
Select D.Id_Dominio, SUM(D.Id_Dominio) As Suma --Entendí que quieres la suma, por eso cambie la función
From EMailF_Dominios As D
Where Not Exists(
        Select 1
        From EMailF_Leidos_Unicos LU
        Where D.Id_Dominio = LU.Id_Dominio
    )
    And Not Exists(
        Select 1
        From eMailF_FechasLectura FL
        Where D.Id_Dominio = FL.Id_Dominio
    )
Group By D.Id_Dominio
Order By Sum(D.Id_Dominio) desc
Esta consulta te traera todo lo que está en EMailF_Dominios y no está en ninguna de las otras dos tablas, si necesitas todo lo que no está en al menos una le cambias el And Not Exists... por un Or Not Exists

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #5 (permalink)  
Antiguo 29/02/2008, 00:07
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 5 meses
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.
  #6 (permalink)  
Antiguo 02/03/2008, 13:45
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 6 meses
Puntos: 6
Re: Registros que no estan en otro tabla

Lo que sucede es que de acuerdo a los nombres de las tablas, la consulta que pone como ejemplo y lo que entiendo que requiere, me imagine lo siguiente, aun cuando no estoy de acuerdo con la estructura:

1.- La tabla EmailF_Dominios contiene los mensajes que se mueven en su sistema
2.- La tabla EmailF_Leidos_Unicos contiene los mensajes que se han leido dentro del sistema (algo como para marcarlos como ya leídos)
3.- La tabla Email_Fechas_Lectura contiene las distintas fechas de lectura de los mensajes


y por lo que entendí el quería obtener lo mensajes que nunca han sido leídos, por eso mi consulta está basada en el total de los mensajes EmailF_Dominio y que no existe en ninguna de las otras tablas, aun cuando a mi parecer si esta es la estructura correcta con que no este en la dentro de la tabla de fechas de lectura, ¿pero quien soy yo para decirle que hacer? jeje

Como bien dices, los exists para mi son la mejor forma de discriminar (inclusive verificar la existencia de) valores de conjuntos, los joins los utilizó solo cuando el select resultante requiere información de las tablas involucradas.


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:45.