BETWEEN CON NULL

12/02/2009 - 10:59 por Cristian Meneses | Informe spam
Buenas a todos
Tengo una tabla Socios y otra Alquileres y estoy probando algo como
esto pero no aparece nada

SELECT
Socios.ID,
Socios.Nombre,
Alquileres.Fecha
FROM Socios
LEFT JOIN Alquileres ON Socios.ID = Alquileres.ID
WHERE
Alquileres.Fecha BETWEEN '01/01/2009' AND '20/01/2009'
OR Alquileres.Fecha IS NULL

La idea es mostrar todos los de Socios con sus alquileres + aquellos
socios que no han alquilado nada durante el periodo.
Muchas gracias por su tiempo. Saludos


Cristian Meneses
SQL Server Express 2005

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
15/02/2009 - 16:17 | Informe spam
Carlos M. Calvelo,

Estuve a punto de empezar el mensaje diciendo "Hola Carlos", cuando me di
cuenta que Carlos Sacristan tambien habia contestado la pregunta original,
asi que el hola va para ambos. :-))

Yo parto de lo siguiente:

1 - La relacion entre ambas tablas es por la columna [ID], segun lo expuesto
(poquito) por el OP.

2 - La columna [Fecha], en la tabla [Alquileres], no permite NULL.

Dada esas condiciones, la forma en que el OP trato de resolver el problema
no es la adecuada, debido a que la condicion en el join es por la columna
[ID], asi que esta union esta trayendo todos los socios mas su informacion de
alquiler si es que alguna vez, fijate que voy a recalcar de que alguna vez se
alquilo algo. Una vez que tenemos este resultado, pasamos a filtrar los que
tienen NULL en la columna [Alquileres].[Fecha], que son los socios que nunca
han alquilado, y tambien se filtran los que solo alqularon en ese rango, y se
eliminan por completos lo que si han alquilado alguna vez pero no en ese
rango. Segun entendi, lo que se quiere es la informacion de alquiler de los
que alquilaron en ese rango de fechas junto con la informacion de los socios,
pero tambien se quiere la informacion de los socios que no alquilaron en ese
rango de fechas. En la sentencia usado por el OP, los que han alquilado fuera
de ese rango, no vendran en el resultado puesto que la condicion "Fecha is
null or Fecha between @sd and @ed" no se cumple. Por eso es que promuevo la
condicion de chequeo de rango de fechas a formar parte de la condicion de el
join.

Veamos un ejemplo.

Socios:

1 - Carlos Sacristan
2 - Carlos M. Calvelo
3 - Alejandro Mesa

Alquileres:

1 - 20090101
1 - 20090115

2 - 20090125


Si usamos el rango "20090125 - 20090131", entonces el resultado de la
sentencia original sera:

2 - Carlos M. Calvelo - 20090125
3 - Alejandro Mesa - NULL

Mientras que si promovemos el chequeo de rango hacia el join, el resultado
sera:

1 - Carlos Sacristan - NULL
2 - Carlos M. Calvelo - 20090125
3 - Alejandro Mesa - NULL


Me pregunto si ese sera el problema que esta teniendo el OP, y si esta
correcto lo supuesto al principio de este mensaje.


AMB


"Carlos M. Calvelo" wrote:

Mostrar la cita
#7 Carlos M. Calvelo
15/02/2009 - 18:20 | Informe spam
Hola Alejandro,


On 15 feb, 16:17, Alejandro Mesa
wrote:
Mostrar la cita
Y Cristian Meneses? :-)



Mostrar la cita
Está claro que con el LEFT JOIN parece que se quiere decir que
en todo caso se quieren todos los Socios en el resultado.
Y después filtrarlos en el WHERE, pues si que parece ilógico.

A mi simplemente se me había ocurrido lo del formato de las
fechas y después de pensarlo... nahhhh :)
También me pareció que es un poco raro que una columna
llamada ID en una tabla llamada Alquileres sea un ID de Socio.

Pero estoy seguro, y tu también :), de que los tiros van
por donde tu has explicado. Espero le sirva a Cristian.

Saludos,
Carlos
#8 Alejandro Mesa
15/02/2009 - 19:30 | Informe spam
Carlos,

Mostrar la cita
LOL!!!

Se me paso hacerlo parte de el ejemplo, aunque no lo consideraria como socio
por no habernos dado toda la informacion necesaria. :-))

AMB



"Carlos M. Calvelo" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida