Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Problema con consulta not in (select ....)

Hola, tengo un problemilla con uhna consulta not in, no son mi fuerte pues generalmente tengo lagún atasco con ellas.

Bueno primeramente deciros que utilizo interbase 6.0, la consulta la tengo en una procedimiento almacenado, pero bueno eso no es trascendental para el problema ya que todas las de este tipo las he hecho de esta forma y no me han dado problemas.

Os detallo como va el asunto:
Tengo 2 tablas una de estancias y otra de facturas de la siguiente forma:

estancia habfact
cod_hab cod_fact
fechai cod_hab
fechaf cod_r
cod_cli
cod_emp
cod_r

estancia habfact
100 1
10/09/05 100
20/09/05 1
2
2
1

101 2
10/10/05 101
20/10/05 2
0
0
2

102 3
... 102
... 3
...
...
3


Hay os he puesto los campos de ambas tablas, siendo los campos
importantes cod_hab(habitacion) y cod_r (reserva) ,lo que pretendo
hacer es que me salgan todas las estancias que no están facturadas,
pero tiene el siguiente inconveniente: se relacionan por dos campos cod_hab y cod_r, el código de reserva puuede tener más de una habitacion
(cod_hab) asignada y una misma habitacion(cod_hab) puede
pertenecer a diferentes (cod_r), y por si fuera poco yo igual
sólo quiero facturar un cod_r con un cod_hab, es decir, que de
una reserva sólo quiero facturar una habitación y no todas ó
facturo una habitación perteneciente a una reserva, pero también
pertenece a otras eso sí en diferentes fechas.

Bueno basicamente yo se lo que quiero sacar pero no se como, lo que yo hago es lo siguiente:
Código:
 
SELECT ESTANCIA.COD_HAB,ESTANCIA.FECHAI,ESTANCIA.FECHAF,
ESTANCIA.DEPOSITO,REGIMEN.COD_REG,REGIMEN.SIGLAS,REGIMEN.TIPO,
ESTANCIA.COD_R,ESTANCIA.HABOBLI
FROM ESTANCIA,REGIMEN
WHERE ESTANCIA.COD_REG=REGIMEN.COD_REG
AND (((ESTANCIA.FECHAI>=:FI) AND 
(ESTANCIA.FECHAF<=:FF)) OR 
((ESTANCIA.FECHAF>=:FI) AND 
(ESTANCIA.FECHAF<=:FF) AND 
(ESTANCIA.FECHAF<=:FF) AND (ESTANCIA.DIFMES>=:FI)
 AND (ESTANCIA.DIFMES<=:FF))OR
 ((ESTANCIA.FECHAI>=:FI)AND (ESTANCIA.FECHAI<=:FF) 
AND (ESTANCIA.DIFMES>:FF)) OR ((ESTANCIA.FECHAI<=:FI) 
AND (ESTANCIA.FECHAF>=:FF)) or ((estancia.fechai<=:FI) AND ((ESTANCIA.FECHAF>=:FI) AND (ESTANCIA.FECHAF<=:FF))) OR (((ESTANCIA.FECHAI>=:FI) AND (ESTANCIA.FECHAI<=:FF)) AND (ESTANCIA.FECHAF>=:FF)))
AND (ESTANCIA.COD_HAB NOT IN(SELECT HABFACT.COD_HAB FROM HABFACT,ESTANCIA WHERE HABFACT.COD_R=HABFACT.COD_R AND HABFACT.COD_HAB=ESTANCIA.COD_HAB)
AND (ESTANCIA.COD_R NOT IN (SELECT HABFACT.COD_R FROM HABFACT,ESTANCIA WHERE ESTANCIA.COD_HAB=HABFACT.COD_HAB AND ESTANCIA.COD_R=HABFACT.COD_R) and estancia.cod_hab not in (SELECT HABFACT.COD_R FROM HABFACT,ESTANCIA WHERE ESTANCIA.COD_HAB=HABFACT.COD_HAB AND ESTANCIA.COD_R=HABFACT.COD_R))
ORDER BY ESTANCIA.FECHAI ASC
lo que hace aqui es que primero me comprueba que la reserva no este en la tabla factura y luego que la habitacion de estancia no esté en lña tabla factura por lo tanto me lo coje de líeas de la tabla distintas y yo lo que quiero es que lo compruebe las 2 condiciones de una vez de esta forma me lo cojería de la misma fila de valores de la tabla.

No se si me he explicado muy bien u os he liado más, si no lo entendeís por favor decidmelo y me intento explicar mejor, aunque la verdad es que no se como hacerlo.

Gracias por su ayuda.

Última edición por VRO fecha: 27-09-2005 a las 19:06:22.
Responder Con Cita
  #2  
Antiguo 28-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Aparte de que el codigo esta un poco largo.

Para que lo puedan leer primero deberias comensar por darles formato en vez de usar la etiqueta de usa . Ya que a muchas persoans no le gusta leer codigo muy largo y menos a los programadores.

Por que de lo cantrario est aun poc dificil que te respondan.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #3  
Antiguo 28-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Lo resumo

Basicamente lo que quiero hacer es una consulta Not In que cumpla 2 condiciones a la vez, ya que si pongo un not in con la 1ª condición y luego otro con la 2ª no me sirve, sería lo mismo que un inner join , pero con delphi 6 no me deja.

Es imprescindible que cumpla las 2 condiciones a la vez.

Siento a ver liado la madeja

Muchas gracias.
Responder Con Cita
  #4  
Antiguo 28-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Código SQL [-]
  Select "Id"
  From "Facturas"
  Where Not("Id" In (228) or "Id" In (231))
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #5  
Antiguo 29-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Talking Gracias

Mil gracias es lo que buscaba.

Graciassssssssssssssss.
Responder Con Cita
  #6  
Antiguo 29-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Perdona

Me he dado cuenta que me falla en algunos casos, lo que yo busco el algo como:

Código:
   select *
   from estancia
   where not (id in (220) and hab in (220))
ambas condiciones buscadas en la misma tupla.

Ya que esto me falla si hay algun valor de una campo iguale
en otra tupla.
Responder Con Cita
  #7  
Antiguo 29-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Código SQL [-]
Select "Id"
  From "Facturas"
  Where Not("Id" In (228, 231))
Asi quedaria
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #8  
Antiguo 29-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
yo lo que me refiero es que 2 campos, p ej, Id y Hab (los 2 campos a la vez) no se encuentren en una misma tabla en una misma tupla.

algo asi como:

Código:
  select id, hab
from  tabla
where not (hab, Id in (select hab,id from tabla2))
Sería algo así porque tu los valores 228 y 231 ya los conoces yo no les se.

No se si me explico ó igual es que ya me ozeco y no entiendo tu ejemplo.

Gracias por tu ayuda y por intentar solventar mi problema
Responder Con Cita
  #9  
Antiguo 29-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Por que no haces una pregunta bien concreta de uan vez y por todas.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #10  
Antiguo 29-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

In es par aun solo valor asiq ue haslo separado
Código SQL [-]
  Select id, hab
  From  tabla
    where not (hab in (select hab from tabla2) And 
             not (Id in (select Id from tabla2)

Y has tus pregustas concretas.
Y usa la etiquetas de sql cuando el codigo sea sql delphi cuando se delphi.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #11  
Antiguo 30-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Perdona de verdad que te moleste, esa consulta es la que tengo yo hecha , pero no coje ambos valores de una misma tupla y yo lo que necesito es que coja ambos de una misma tupla de la misma tabla.
Responder Con Cita
  #12  
Antiguo 30-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Hago un ultimo intento por entenderte.

Mira me puedes poner un ejemplo de la estructura de la dos tablas y algunos datos y la intruccion sql y que dberia devolverte para resolverte el problema que tienes. Pero por favor dedica un tiempito hacer loq ue te pido para que te pueda ayudar.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #13  
Antiguo 03-10-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Wink Gracias por tu interes

Siento no haberte escrito antes y entiendo que despues
de todo lo que has peleado por la consulta igual te haya enojado ,
no es falta de interés , es problema con el internet, nos hemos
quedado sín él, aparentemente lo hemos arreglado , pero vuelve
a fallar. Bueno no quiero aburriete con los problemillas. Al grano:

Todo lo que me pides se encuentra en el primer hilo , te lo
vuelvo a escribir haber si está vez lo hago mejor.

Tengo 2 tablas estancia y habfact con los siguientes campos:

Cita:

estancia
cod_hab
fechai
fechaf
cod_emp
cod_cli
cod_r

habfact
cod_fact
cod_hab
cod_r
Te pongo ejemplos de valores:

Cita:
estancia habfact
100 1
10/09/05 100
20/09/05 1
2
2
1


100 2
10/10/05 101
20/10/05 2
0
0
2


102 3
... 102
... 3
...
...
3
Lo que pretendo conseguir son las estancias que no están
facturadas entre 2 fechas. Las estancias las saco de la tabla estancias
y las facturas de la tabla habfact, como podemos comprobar las
relaciones se hacen con 2 campos cod_hab y cod_r que están en
ambas tablas.

La consulta sql queda:

Código SQL [-]
 
 
SELECT ESTANCIA.COD_HAB,ESTANCIA.FECHAI,ESTANCIA.FECHAF,
ESTANCIA.COD_R
FROM ESTANCIA
WHERE ((NOT ESTANCIA.COD_HAB IN(SELECT HABFACT.COD_HAB 
FROM HABFACT)
AND (NOT ESTANCIA.COD_R IN (SELECT HABFACT.COD_R FROM 
HABFACT)))
ORDER BY ESTANCIA.FECHAI ASC

Tal y como lo hacemos tiene un problema, obseervando los valores
ejemplo, la estancia de cod_hab=100 y cod_r=1, está facturada, lo
mismo pasa con la estancia de cod_hab=102 y cod_r=3, hasta aquí
todo bien, el problema está en que con este código la estancia de cod_hab=100 y cod_r=2 también me aparece como facturada
y no tendría que ser así, ya que me lo pone facturada cuando ya hay en
la tabla un cod_hab y un cod_r de igual valor al de estancia aunque
no sea en la misma tupla. Ambas cosas a la vez.

Espero haberme explicado ahora mejor, siento haberme explallado
tanto pero creo que es la única forma de comprenderlo, ya que el
asunto es un poco dificil.

Gracias por intentar ayudarme .

Eternamente agradecido.

PD: Lo valores de ejemplo, lo siento, no consigo que te aparezcan
en forma de 2 tablas.Perdón.

Última edición por VRO fecha: 03-10-2005 a las 19:04:44.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:21:45.


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
Copyright 1996-2007 Club Delphi