CROSS JOINS CON NULLS

03/01/2007 - 09:44 por Txarlie | Informe spam
Hola:

Tengo un problema con una consulta. Tengo dos tablas que quiero
relacionar mediante un CROSS JOIN, pero pierdo valores por culpa de
valores NULL.

La tabla A tiene los campos ID y DESCRIPCION. La tabla B tiene
IDASPECTO, IDTIPO, IDSUBTIPO, VALOR.

El problema es que la tabla B, en alguno de sus registros, el campo
IDSUBTIPO está a NULL (en otros no) y al hacer el cross join no
devuelve esos campos.

Sólo se me ocurre hacerlo medianto un cursor, pero me gustaría
evitarlo (¡Mata a un cursor!).

¿Hay alguna claúsula que no haya visto al usar CROSS JOIN? ¿Se puede
hacer un CROSS INNER JOIN o algo así? ¿El cursor acará siendo la
mejor opción?

Gracias por adelantado,

Preguntas similare

Leer las respuestas

#1 Maxi
03/01/2007 - 13:15 | Informe spam
Hola y porque usar un CROSS y no un LEFT JOIN?


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Txarlie" escribió en el mensaje
news:
Hola:

Tengo un problema con una consulta. Tengo dos tablas que quiero
relacionar mediante un CROSS JOIN, pero pierdo valores por culpa de
valores NULL.

La tabla A tiene los campos ID y DESCRIPCION. La tabla B tiene
IDASPECTO, IDTIPO, IDSUBTIPO, VALOR.

El problema es que la tabla B, en alguno de sus registros, el campo
IDSUBTIPO está a NULL (en otros no) y al hacer el cross join no
devuelve esos campos.

Sólo se me ocurre hacerlo medianto un cursor, pero me gustaría
evitarlo (¡Mata a un cursor!).

¿Hay alguna claúsula que no haya visto al usar CROSS JOIN? ¿Se puede
hacer un CROSS INNER JOIN o algo así? ¿El cursor acará siendo la
mejor opción?

Gracias por adelantado,
Respuesta Responder a este mensaje
#2 Txarlie
03/01/2007 - 14:00 | Informe spam
El LEFT JOIN o el RIGHT me omite los valores NULLS... Y eso provoca que
al final no pueda llegar a hacer un SUM de una serie de valores.

Me veo haciendo el cursor. Gracias.

Maxi ha escrito:

Hola y porque usar un CROSS y no un LEFT JOIN?


Salu2

Microsoft MVP SQL Server
Culminis Speaker
Respuesta Responder a este mensaje
#3 Txarlie
03/01/2007 - 15:46 | Informe spam
Gracias por el interés. Os envío más datos. Ahora he ido retocando
la consulta a ver si lograba sacar algo en claro. Esta es la Select que
me elimina los nulls. Tiene un CROSS JOIN y un INNER JOIN, porque
necesito que intervengan 3 tablas.

La CROSS JOIN entre la tabla #Plantas y la tabla #Aspec_Tipos me
devuelve los registros que necesito. A eso le hago llamar Tabla1. El
problema exactamente está al hacer INNER JOIN del resultado de esa
CROSS JOIN con la Tabla2.

SELECT Tabla1.ID_CODELE, Tabla1.ID_ASPECTO, Tabla1.ID_TIPO,
Tabla1.ID_SUBTIPO, SUM(CAST(Tabla2.VL_CMPASPAMB AS INT)) AS SEMAFORO
FROM (SELECT #PLANTAS.ID_CODELE, #ASPEC_TIPOS.ID_ASPECTO,
#ASPEC_TIPOS.ID_TIPO,#ASPEC_TIPOS.ID_SUBTIPO
FROM #PLANTAS CROSS JOIN #ASPEC_TIPOS) AS Tabla1
INNER JOIN Tabla2 ON
Tabla2.ID_CODELE = Tabla1.ID_CODELE AND
Tabla2.ID_CODASPAMB = Tabla1.ID_ASPECTO AND
Tabla2.ID_TIPASPAMB = Tabla1.ID_TIPO AND
Tabla2.ID_STPASPAMB = Tabla1.ID_SUBTIPO
GROUP BY Tabla1.ID_CODELE, Tabla1.ID_ASPECTO, Tabla1.ID_TIPO,
Tabla1.ID_SUBTIPO, Tabla2.VL_CMPASPAMB
ORDER BY Tabla1.ID_CODELE, Tabla1.ID_ASPECTO

No hay ni un sólo WHERE, pero hay un GROUP. El problema imagino que
estará en los campos ID_SUBTIPO que en algunos casos es NULL. Y en vez
de agruparme los campos y establecer su valor a NULL, me los omite.

Gracias por las respuestas. Un saludo,



Alejandro Mesa ha escrito:

Txarlie,

Cuando se postea este tipo de preguntas en el grupo, es importante que se
adjunte la estructura de las tablas involucradas, incluyendo restricciones e
indices, asi como data de ejemplo (sentencias insert) y resultados esperados.
La ayuda debe ser mutua, no crees?

La operacion "CROSS JOIN" no omite nada, simplemente realiza un producto
cartesiano. Si estas empleando algun filtro en la clausula "where" entonces
hablamos de otra cosa y como no tenemos sentencia alguna para ver lo que esta
pasando, pues ni modo.

Ejemplo:

select
*
from
(select cast(NULL as int) as c1 union all select cast(NULL as int)) as t1
CROSS JOIN
(select cast(NULL as int) as c2 union all select cast(NULL as int)) as t2
go


AMB

"Txarlie" wrote:

> Hola:
>
> Tengo un problema con una consulta. Tengo dos tablas que quiero
> relacionar mediante un CROSS JOIN, pero pierdo valores por culpa de
> valores NULL.
>
> La tabla A tiene los campos ID y DESCRIPCION. La tabla B tiene
> IDASPECTO, IDTIPO, IDSUBTIPO, VALOR.
>
> El problema es que la tabla B, en alguno de sus registros, el campo
> IDSUBTIPO está a NULL (en otros no) y al hacer el cross join no
> devuelve esos campos.
>
> Sólo se me ocurre hacerlo medianto un cursor, pero me gustaría
> evitarlo (¡Mata a un cursor!).
>
> ¿Hay alguna claúsula que no haya visto al usar CROSS JOIN? ¿Se puede
> hacer un CROSS INNER JOIN o algo así? ¿El cursor acará siendo la
> mejor opción?
>
> Gracias por adelantado,
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida