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

Hacer LEFT JOIN en Oracle

Estas en el tema de Hacer LEFT JOIN en Oracle en el foro de Bases de Datos General en Foros del Web. Cómo puedo hacer un LEFT JOIN en Oracle? Ya que no he podido hacer INNER JOIN en Oracle, lo que hago es que pongo Código: ...
  #1 (permalink)  
Antiguo 21/10/2004, 12:08
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Hacer LEFT JOIN en Oracle

Cómo puedo hacer un LEFT JOIN en Oracle?

Ya que no he podido hacer INNER JOIN en Oracle, lo que hago es que pongo
Código:
Select Tabla1.Campo, Tabla2.Campo from Tabla1, Tabla2 WHere Tabla1.Campo = Tabla2.Campo.
Con esto simulo mi INNER JOIN y me funciona perfectamente, pero ahora quiero que cuando no se cumpla la condición que me traiga el campo Tabla2.Campo en blanco...

Cómo hago eso en Oracle?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #2 (permalink)  
Antiguo 21/10/2004, 12:54
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Encontré un documento en esta página (http://www.programacion.com/tutorial/sql/8/ ) que dice lo siguiente:
Cita:
Referente a los JOIN, no funcionan en ORACLE y además no conozco una sintaxis que funcione en los tres sistemas. La sintaxis en ORACLE es igual a la sentencia anterior pero añadiendo los caracteres (+) detrás del nombre de la tabla en la que deseamos aceptar valores nulos, esto equivale a un LEFT JOIN:
SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes
WHERE Facturas.IdAlbaran = Albaranes.IdAlbaran (+) AND Facturas.IdCliente = 325
Y esto a un RIGHT JOIN:
SELECT Facturas.*, Albaranes.* FROM Facturas, Albaranes
WHERE Facturas.IdAlbaran (+) = Albaranes.IdAlbaran AND Facturas.IdCliente = 325
Hice mi Consulta de la siguiente manera:
Código:
Select * from OpenQuery(DESARROLLO,'
SELECT Mcshierb.PARENT, Mcshierb.Name, MAKT.MAKTX, SUBSTR(S021.Sptag,5,2), SUBSTR(S021.Sptag,1,4), sum(S021.PSMNG) AS total
FROM Mcshierb, MAKT, S021 
WHERE Mcshierb.Appl = ''MCS''
        And Mcshierb.Hname = ''CLAS-MAT01''
	And Mcshierb.MANDT = 210
	And (Mcshierb.PARENT = 14 or Mcshierb.PARENT = 15 or Mcshierb.PARENT = 16 or Mcshierb.PARENT = 17) 
	And Mcshierb.Name = MAKT.MATNR
	And Mcshierb.MANDT = MAKT.MANDT
	And MAKT.SPRAS = ''S'' 
	And Mcshierb.MANDT = S021.MANDT (+)  
	And Mcshierb.Name = S021.MATNR  (+)  
	And ( S021.Sptag >= ''20040801'' And S021.Sptag <= ''20040831'' )
GROUP BY Mcshierb.PARENT, Mcshierb.Name, MAKT.MAKTX, SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
Order By Mcshierb.PARENT,Mcshierb.Name
')
Si se fijan, le puse a los dos campos los cuales quiero que me realice el LEFT JOIN el signo de (+). El select me funciona pero como si fuera INNER JOIN, no me está haciendo el efecto del LEFT JOIN.

Probé asi tambien y nada, sigue funcionando como un INNER JOIN:
Código:
Select * from OpenQuery(DESARROLLO,'
SELECT Mcshierb.PARENT, Mcshierb.Name, MAKT.MAKTX, SUBSTR(S021.Sptag,5,2), SUBSTR(S021.Sptag,1,4), sum(S021.PSMNG) AS total
FROM Mcshierb, MAKT, S021 
WHERE Mcshierb.Appl = ''MCS''
        And Mcshierb.Hname = ''CLAS-MAT01''
	And Mcshierb.MANDT = 210
	And (Mcshierb.PARENT = 14 or Mcshierb.PARENT = 15 or Mcshierb.PARENT = 16 or Mcshierb.PARENT = 17) 
	And Mcshierb.Name = MAKT.MATNR
	And Mcshierb.MANDT = MAKT.MANDT
	And MAKT.SPRAS = ''S'' 
	And Mcshierb.MANDT (+)  = S021.MANDT 
	And Mcshierb.Name (+) = S021.MATNR
	And ( S021.Sptag >= ''20040801'' And S021.Sptag <= ''20040831'' )
GROUP BY Mcshierb.PARENT, Mcshierb.Name, MAKT.MAKTX, SUBSTR(S021.Sptag,5,2), SUBSTR(S021.Sptag,1,4)
Order By Mcshierb.PARENT,Mcshierb.Name
')
Pensé que era que tenía que ponerlo en el campo fecha también. Me decidí a ponerle el (+) y me explotó. Que estoy haciendo mal?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--

Última edición por RsOfT; 21/10/2004 a las 13:04
  #3 (permalink)  
Antiguo 21/10/2004, 13:20
 
Fecha de Ingreso: septiembre-2004
Mensajes: 171
Antigüedad: 19 años, 6 meses
Puntos: 0
Combinación Interna: WHERE ClavePrimaria= ClaveAjena
Combinación Externa a Izquierdas WHERE ClavePrimaria (+)= ClaveAjena
Combinación Externa a Derechas WHERE ClavePrimaria = ClaveAjena (+)
Combinación Externa Simétrica :No soportada. Puede lograrse mediante una UNION


está sacado de los apuntes que me dieron este año, precisamente lo estube dando hace una semana, ahi te queda por si te sirve de algo sobre relaciones tenia esos comandos para oracle o esos son los que hemos dado hasta el momento. Espero que t sea de ayuda
  #4 (permalink)  
Antiguo 21/10/2004, 13:30
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Si te fijas, estoy utilizando esos mismos comando que me muestras, el problema es que no están haciendo su función. Verifica mi consulta a ver si puedes ver algo raro que yo aún no he podido ver.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #5 (permalink)  
Antiguo 21/10/2004, 15:30
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
MM.. no será que estas acomodando mal tus tablas para hacer el left join..??

Podría ser así:

Cita:
....
And Mcshierb.MANDT = MAKT.MANDT
And MAKT.SPRAS = ''S''
And Mcshierb.MANDT = S021.MANDT(+)
And Mcshierb.Name = S021.MATNR(+)
...

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #6 (permalink)  
Antiguo 22/10/2004, 06:41
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
No entiendo Rootk, Cual es la diferencia entre lo que pusiste tu y lo que puse yo?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #7 (permalink)  
Antiguo 22/10/2004, 08:39
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Tu pusiste

Cita:
And Mcshierb.MANDT (+) = S021.MANDT
And Mcshierb.Name (+) = S021.MATNR
y yo puse:

Cita:
And Mcshierb.MANDT = S021.MANDT(+)
And Mcshierb.Name = S021.MATNR(+)
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #8 (permalink)  
Antiguo 22/10/2004, 08:59
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
No, rootk, no leiste bien, jeje, yo puse en mi Post lo siguiente:

Cita:
Hice mi Consulta de la siguiente manera:
...
And Mcshierb.MANDT = S021.MANDT (+)
And Mcshierb.Name = S021.MATNR (+)
...

Si se fijan, le puse a los dos campos los cuales quiero que me realice el LEFT JOIN el signo de (+). El select me funciona pero como si fuera INNER JOIN, no me está haciendo el efecto del LEFT JOIN.

Probé asi tambien y nada, sigue funcionando como un INNER JOIN:
...
And Mcshierb.MANDT (+) = S021.MANDT
And Mcshierb.Name (+) = S021.MATNR
...
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #9 (permalink)  
Antiguo 22/10/2004, 11:52
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
no leiste bien, jeje, yo puse en mi Post lo siguiente
Pues no creo que este todavía alucinando friend.. pero checa tu segundo mensaje y tienes ésto:

Cita:
Hice mi Consulta de la siguiente manera:

Select * from OpenQuery(DESARROLLO,'
SELECT Mcshierb.PARENT, Mcshierb.Name, MAKT.MAKTX, SUBSTR(S021.Sptag,5,2), SUBSTR(S021.Sptag,1,4), sum(S021.PSMNG) AS total
FROM Mcshierb, MAKT, S021
WHERE Mcshierb.Appl = ''MCS''
And Mcshierb.Hname = ''CLAS-MAT01''
And Mcshierb.MANDT = 210
And (Mcshierb.PARENT = 14 or Mcshierb.PARENT = 15 or Mcshierb.PARENT = 16 or Mcshierb.PARENT = 17)
And Mcshierb.Name = MAKT.MATNR
And Mcshierb.MANDT = MAKT.MANDT
And MAKT.SPRAS = ''S''
And Mcshierb.MANDT = S021.MANDT (+)
And Mcshierb.Name = S021.MATNR (+)

And ( S021.Sptag >= ''20040801'' And S021.Sptag <= ''20040831'' )
Pero donde si lo pusiste fue aqui:

Cita:
Probé asi tambien y nada, sigue funcionando como un INNER JOIN:
...
..And MAKT.SPRAS = ''S''
And Mcshierb.MANDT (+) = S021.MANDT
And Mcshierb.Name (+) = S021.MATNR
Pero en fin.. el caso es que de ninguna de las 2 formas te funciona... y eso me parece extraño, yo imagino que el problema tal vez venga de la forma en que se están acomadando las tablas para hacer el left...es mas puedes hacer está prueba (igual y funciona)

Cita:
...
And S021.MANDT = MANDTMcshierb.MANDT (+)
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 12:21.