Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Registros de una tabla que no se encuentren en otra (https://www.clubdelphi.com/foros/showthread.php?t=8654)

Ignacio 29-03-2004 17:20:04

Registros de una tabla que no se encuentren en otra
 
Tengo una tabla MAQUINAS, sus campos son NumeroMAQ y NombreMAQ.
Tengo otra tabla SESIONES la cual almacena la hora inicial y final de cada sesión, y el numero de máquina usada en dicha sesión. Mi intensión es mostrar una lista de maquinas que en ese momento no se encuentren en la tabla SESIONES o que si se encuentren tengan la condición de sesión cerrada, almacenada en un campo lógico.

marcoszorrilla 29-03-2004 17:38:16

Este ejemplo lo acabo de construir con el asistente gráfico de consultas de Access:

Código:

SELECT DISTINCTROW [TB_ALUMNOS].[NOMBRE], [TB_ALUMNOS].[APELLIDOS], [TB_ALUMNOS].[DNI]
 FROM TB_ALUMNOS LEFT JOIN TB_ALUMNOS_CURSOS ON [TB_ALUMNOS].[Matricula] = [TB_ALUMNOS_CURSOS].[MATRICULA]
 WHERE ([TB_ALUMNOS_CURSOS].[MATRICULA] Is Null);

Un Saludo.

cahp 29-03-2004 19:01:59

Hola:

mira a ver con 'not in':

select *
from maquinas
where numeroMAQ not in (select distinct numeroMAQ from sesiones)


Espero que te sirva.

Saludos.

Ruben_Cu 30-03-2004 04:30:27

Hola Ignacio, puedes usar el predicado Exists(para eso está concebido), te pongo un ejemplo que pudieras adecuar a tu proyecto sacado de la ayuda de SQL.
Código:

SELECT O.OrderNo, O.CustNo
FROM Orders O
WHERE EXISTS
  (SELECT C.CustNo
  FROM Customer C
  WHERE (C.CustNo = O.CustNo))

En tu caso sería utilizar NOT EXISTS para obtener los regristros que no existen además de agregarle la condición del campo booleano que comentas.
Saludos

Ignacio 31-03-2004 02:01:59

Muchas gracias por la ayuda a los tres.
Las cosas que me han sugerido me solucionan la mitad del problema. Quizas debería explicar más y mejor el caso donde debo aplicar la consulta.

Tengo 9 maquinas en una tabla. Cada sesión de internet de un ciber, que se guardan en la tabla SESIONES tiene un campo llamado MaquinaSES que almacena el numero de máquina, dicha sesión tambien tiene un campo llamado EstadoSES que vale 1 cuando la sesión está activa.

Mi intención es ver en un DBlookupComboBox una lista de las máquinas que no esten en la tabla SESIONES y las que si están (y de hecho puede estar más de una ves*), pero que en el campo EstadoSES ses distinto de "1", valor que indica que esa máquina está en uso.

*Ojo. Debo evitar que una máquina aparezca más de una vez. Tengo la impresión de haber visto en algun hilo la forma de mostrar una sola ves un registro que se encuentre mas de una vez.

Espero aberme explicado. Mucha gracias por la ayuda hasta ahora recibida y por la que seguramente me darán.

Ruben_Cu 31-03-2004 03:15:02

Bueno, continuando con el tema te propongo que pruebes con al como esto:
Código:

SELECT t.nomaquina FROM tablamaquinas t
WHERE not EXISTS
  (SELECT s.MaquinaSES FROM SESIONES S
  WHERE (s.MaquinaSES = t.nomaquina) and s.EstadoSES='1')

Tendrías que conectar el DBLookupComboBox a través de un datasource al Query que estas usando para mostrar el resultado de la busqueda, como estás tomando los registros de tu tabla de nueve máquinas no se te repetirán puesto que en ella deben únicos.
Esto no lo he probado pero si te presenta problemas vuelves por acá o analiza que te está devolviendo y donde puede estar la dificultad.
Ahh... si el campo EstadoSESes para determinar solo si la máquina está en uso o no creo que te iría mejor un campo booleano.
Saludos y suerte

Ignacio 31-03-2004 16:30:54

Gracias nuevamente.
Andubo perfecto. Solo me estaba faltando la última condición s.EstadoSES='1'.
Con respecto al campo EstadoSES, no es boolean porque puede tener 3 estados posibles. 1=Abierta, 2=cerrada y 3=Anulada.

Hasta la próxima


La franja horaria es GMT +2. Ahora son las 02:43:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi