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

ayuda con consulta

Estas en el tema de ayuda con consulta en el foro de SQL Server en Foros del Web. Hola a todos, tengo una gran duda al realizar una consulta, ya busque varias maneras, y me decidi a consultar en mi foro favorito, estoy ...
  #1 (permalink)  
Antiguo 18/07/2007, 09:43
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
ayuda con consulta

Hola a todos, tengo una gran duda al realizar una consulta, ya busque varias maneras, y me decidi a consultar en mi foro favorito, estoy trabajando en sql server 2005 express y tengo las siguientes tablas:

1.- Administrativo con los campos: ad_contrato,ad_mac, ad_velocidad, ad_estado, ad_lugar (con 3500 registros)
2.- Tecnico con los campos: tec_mac, tec_velocidad, tec_estado (con 3600 registros)

el objetivo de esta pekeña bd es buscar inconsistencias entre ambas tablas,
en ellas, los campos en comun son ad_mac y tec_mac,el problema es que necesito saber que registros en tecnico son los que no aparecen en administrativo, sinceramente no me doy idea de como hacer esa consulta, alguien podria ayudarme???
__________________
«~MaGax3iNeMD~»
  #2 (permalink)  
Antiguo 18/07/2007, 09:51
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 6 meses
Puntos: 8
Re: ayuda con consulta

Que tal Mackbeth.

Código:
SELECT t.* 
FROM Tecnico t right outer join Administrativo a ON
    t.tec_mac = a.ad_mac
WHERE  a.ad_mac IS NULL
Saludos!
  #3 (permalink)  
Antiguo 18/07/2007, 10:54
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

Muchas gracias por responder rapido Daniel00, he probado tu sentencia, pero ne devuelve puros valores nulos
__________________
«~MaGax3iNeMD~»
  #4 (permalink)  
Antiguo 18/07/2007, 12:52
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: ayuda con consulta

Hola Mackbeth

Dime si funciona esta sentencia.

SELECT * FROM Tecnico WHERE tec_mac NOT IN(SELECT DISTINCT ad_mac FROM Administrativo)
  #5 (permalink)  
Antiguo 18/07/2007, 15:19
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

Me parece excelente tu consulta y muy logica, pero desafortunadamente no funciono me devolvio 0 registros
__________________
«~MaGax3iNeMD~»
  #6 (permalink)  
Antiguo 18/07/2007, 17:19
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: ayuda con consulta

Entonces, quiere decir que TODOS los registros de TECNICO estan en ADMINISTRATIVO, asi de simple.
  #7 (permalink)  
Antiguo 19/07/2007, 08:07
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

Pues no lo creo, por que en tecnico hay 100 registros mas que en administrativo,como lo puse en el primer post, administrativo tiene 3500 y tecnico 3600, de hecho estoy pensando en meter la consulta en una aplicacion .net y con ayuda de un datareader, hacer una busqueda por codigo, aunque inicialmente no queria hacer la aplicacion, pero al no haber de otra, publicare el codigo de la aplicacion
__________________
«~MaGax3iNeMD~»
  #8 (permalink)  
Antiguo 19/07/2007, 12:33
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: ayuda con consulta

No, espera, ¿eso quiere decir que entonces NO TIENES una Primary Key?

Porque en el ejemplo que te puse, hace referencia al PK (tec_mac, ad_mac), o dime, ¿Que campos conforman tu PK?
  #9 (permalink)  
Antiguo 19/07/2007, 12:45
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

asi es, como no puede existir una mac duplicada ni en administrativo ni tecnico, decidi ponerlo como pk
__________________
«~MaGax3iNeMD~»
  #10 (permalink)  
Antiguo 19/07/2007, 18:10
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: ayuda con consulta

Aclarame algo, los 3500 registros en TECNICO, son UNICOS????
  #11 (permalink)  
Antiguo 20/07/2007, 08:53
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

asi es, no puede existir mac duplicadas, por eso los puse como pk, donde no se pueden repetir registros ni quedar nulos
__________________
«~MaGax3iNeMD~»
  #12 (permalink)  
Antiguo 20/07/2007, 12:13
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: ayuda con consulta

Pues si son UNICOS, la consulta:

SELECT * FROM Tecnico WHERE tec_mac NOT IN(SELECT DISTINCT ad_mac FROM Administrativo)

Debe darte aquellos registros que estan en TECNICO y NO SE ENCUENTRAN en ADMINISTRATIVO.

Eso que ni que.................
  #13 (permalink)  
Antiguo 20/07/2007, 13:27
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: ayuda con consulta

Retomando la sentencia de Daniel...
Solo hay que cambiar el join derecho por uno izquierdo...
Para tablas con muchos registros, es mejor hacer un join...

Saludos!

Código:
SELECT t.* 
FROM    Tecnico t 
Left outer join 
          Administrativo a 
ON    t.tec_mac = a.ad_mac
WHERE  a.ad_mac IS NULL
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #14 (permalink)  
Antiguo 20/07/2007, 20:23
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: ayuda con consulta

MackBeth, esta consulta es la que te devuelve el resultado..... Saludos!
Código:
Select *
From Tecnico T
WHERE Not Exists(
    Select 1
    From Administrativo A
    WHERE A.Ad_Mac = T.Ad_Mac
)
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #15 (permalink)  
Antiguo 21/07/2007, 16:07
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: ayuda con consulta

Estaba por contestar lo mismo que ya Andrés ha corregido. Esa manera funcionará de acuerdo a lo esperado.

Personalmente, procuro alejarme de los subquerys cuando trato con tablas con muchos registros.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #16 (permalink)  
Antiguo 21/07/2007, 22:23
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: ayuda con consulta

Jeje, yo tengo muy buenas experiencias de los cursores frente a los Joins, he logrado mejorar le rendimiento de las bd's de donde trabajo sacando joins y usando la sentencia exists...


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #17 (permalink)  
Antiguo 22/07/2007, 14:09
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: ayuda con consulta

He escuchado que bajo ciertas circunstancias, el subquery es más eficiente que el join, por ejemplo en el caso de que las tablas no tengan índices.

Aunque no creería que ese sea tu caso. Por mera curiosidad... ¿Cual es tu caso? ¿Tablas grandes? ¿Indices? ¿hints activados?
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #18 (permalink)  
Antiguo 23/07/2007, 12:30
Avatar de mackbeth  
Fecha de Ingreso: noviembre-2005
Mensajes: 370
Antigüedad: 18 años, 5 meses
Puntos: 10
Re: ayuda con consulta

MUCHAS GRACIAS A TODOS POR SU AYUDA, ESPECIALMENTE A GABO QUE SU CONSULTA ME DIO EL RESULTADO QUE ESPERABA, YA QUE MI VALIDACION Y SU CONSULTA ME DEVOLVIERON EXACTAMENTE EL MISMO RESULTADO, DE TODAS MANERAS COMO HABIA COMENTADO, LO HICE CON CODIGO VB Y AQUI ESTA:

Dim administrativo(0), tecnico(0) As String
Dim dr As SqlDataReader
Dim a As Integer = 0
'================================================= =====
'inicio de busqueda de inconsistencias de alta en administrativo y no en tecnico
Public Sub inc_administrativo_tecnico()
'inicializacion de variables y arreglos
a = 0
ReDim inc(1)
ReDim tecnico(1)
ReDim administrativo(1)
'llenado de arreglo con mac address de tecnico
dr = obj.QueryDR("select tecnico_mac from tecnico")
While dr.Read
tecnico(a) = dr.Item("tecnico_mac").ToString
a += 1
ReDim Preserve tecnico(a)
End While
'vaciado de variables
dr = Nothing
a = 0
'llenado de arreglo con mac adress de administrativo
dr = obj.QueryDR("select administrativo_mac from administrativo")
While dr.Read
administrativo(a) = dr.Item("administrativo_mac").ToString
a += 1
ReDim Preserve administrativo(a)
End While
'inicio de la validacion
For i = 0 To tecnico.Length - 1
For j = 0 To administrativo.Length - 1
If administrativo(j) = tecnico(i) Then
administrativo(j) = 0
End If
Next
Next
For i = 0 To administrativo.Length - 1
If CType(administrativo(i), Object) <> "0" Then
ReDim Preserve inc(i)
inc(i) = CType(administrativo(i), Object)
End If
Next
End Sub


Muchas Gracias a Todos!!
__________________
«~MaGax3iNeMD~»
  #19 (permalink)  
Antiguo 26/07/2007, 19:46
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: ayuda con consulta

Cita:
Iniciado por Mithrandir Ver Mensaje
He escuchado que bajo ciertas circunstancias, el subquery es más eficiente que el join, por ejemplo en el caso de que las tablas no tengan índices.

Aunque no creería que ese sea tu caso. Por mera curiosidad... ¿Cual es tu caso? ¿Tablas grandes? ¿Indices? ¿hints activados?
Una tabla de Log de eventos, contiene mas de 25 millones de registros, la tabla está indexada por un campo llamado idenvio (no es llave por que al ser log registra muchos eventos para el mismo idenvio con diferencia del mensaje arrojado por el sistema y la fecha) cuando busco un idenvio especifico que se encuentra en otra tabla si lo hago vía JOINS (mediante el campo IdEnvio que en la otra tabla si es llave) me tarda entre 20 y 30 segundos , haciendolo en un EXISTS(SubConsulta) Me tarda entre 2 y 3 segundos.... :D Amo mi Exists!

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 06:31.