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

Cambiando Where por LEFT JOIN

Estas en el tema de Cambiando Where por LEFT JOIN en el foro de Bases de Datos General en Foros del Web. Que tal en una consulta que selecciona campos de tres tablas tengo esto en el where: Código PHP: FROM Claims ,  ClaimsFollowUp ,  Repricing WHERE Claims . ...
  #1 (permalink)  
Antiguo 22/11/2005, 07:39
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Cambiando Where por LEFT JOIN

Que tal en una consulta que selecciona campos de tres tablas tengo esto en el where:

Código PHP:
FROM ClaimsClaimsFollowUpRepricing

WHERE Claims
.ClaimID=ClaimsFollowUp.RepricingID AND Claims.ClaimID=Repricing.RepricingID 
Y estoy intentando cambiarlo por esto:

Código PHP:
FROM Claims LEFT JOIN ClaimsFollowUp ON Claims.ClaimID=ClaimsFollowUp.RepricingID
LEFT JOIN Repricing ON ClaimsFollowUp
.RepricingID=Repricing.RepricingID 

Está bien la Sintaxis? Es importante.

la cuestión es que necesito seleccionar todos los correspondientes entre Claims.ClaimID y Repricing.RepricingID y ClaimsFollowUp.RepricingID.

Acutalemnte me los muestra, pero si omite los que no existen correspondientemente en ClaimsFollowUp.RepricingID

Gracias de Antemano.


Pero me sale este error, tengo Access 2003:

  #2 (permalink)  
Antiguo 22/11/2005, 10:37
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
No entiendo bien, ¿quieres que te saque todos los que estén indexados o todos los que esten en Claims y en ClaimsFollowUp aunque no estén en Recipring o todos los que estén en Claims estén o no en el resto?

La sintaxis en SQL es correcta, no se en el caso específico de access.
  #3 (permalink)  
Antiguo 22/11/2005, 10:45
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Que tal, Gracias por cotestar. Para Mayor Claridad,

Necesito todos Los que están en Claims.ClaimID Con la información que tengan si existe en Repricing.RepricingID y ClaimsFollowUp.RepricingID.


Lo que ocurre es que actualemnte si no tienen nada en Repricing.RepricingID y ClaimsFollowUp.RepricingID no me los muestra aunque existan en Claims.


Muchas Gracias, es Importante.
Saludos.
  #4 (permalink)  
Antiguo 22/11/2005, 11:06
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Pues como te comento la consulta en SQL parece totalmente correcta, quizá el Access tiene alguna pirula para ese tipo de consultas, prueba con el outer:

... Left outer join ...

Si no funciona habrá que echar mano de la documentación de access (siempre y cuando las tablas y campos no tengan ningún error)
  #5 (permalink)  
Antiguo 22/11/2005, 11:44
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Bueno Master,

Tampoco Rula el LEFT OUTER JOIN

partiendo desde el WHERE Inicial, encuantras otra forma de hacerlo?

Gracias.
  #6 (permalink)  
Antiguo 22/11/2005, 12:27
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Hombre, sería bastante menos correcto hacerlo así:

Código:
FROM Claims, ClaimsFollowUp, Repricing
WHERE (Claims.ClaimID=ClaimsFollowUp.RepricingID AND Claims.ClaimID=Repricing.RepricingID) 
or (Claims.ClaimID=ClaimsFollowUp.RepricingID AND Claims.ClaimID not in (Select RepricingID From Repricing)) or  
ClaimID not in  (Select RepricingID From claimsFollowUp) and ClaimID not in (Select RepricingID From Repricing))
De momento se me ocurre esto (no lo he probado, no tengo ya hoy tiempo), quizá te sirva como provisional.
  #7 (permalink)  
Antiguo 22/11/2005, 13:35
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Aquí pongo el codigo original de lo que estoy intentando hacer, es decir reemplazar el WHERE ya mencionado por



Código PHP:
FROM Claims LEFT JOIN ClaimsFollowUp ON Claims.ClaimID=ClaimsFollowUp.RepricingID
LEFT JOIN Repricing ON ClaimsFollowUp
.RepricingID=Repricing.RepricingID 
Con el error de que me Falta operador, lo cual me parece inconcebible (já, estoy en Acces)

Bueno si alguien me socorre le estaré inmensamente agradecirdo.

Saludos.


Código PHP:
SELECT Claims.ClaimIDClaims.PatientID AS PatientClaims.ProviderID AS ProividerClaims.InsurerID AS InsurerClaims.DateOfService AS DOS
Claims.DateOfReceiptByMDabroad AS DORRepricing.ConvertedHospitalCharges AS Hosp_ChargesRepricing.HospitalChargesDiscountAmount AS Hosp_Dct_to_InsurerRepricing.ConvertedProfessionalCharges AS Prof_ChargesRepricing.ProfessionalChargesDiscountAmount AS Prof_Dct_to_Ins, (Repricing.ConvertedTotalCharges-(Prof_Dct_to_Ins+Hosp_Dct_to_Insurer)) AS Due_By_InsurerClaims.HospitalChargesDiscount AS Hosp_Pct_to_MDClaims.ProfessionalChargesDiscount AS Prof_Pct_to_MDSUM(ClaimsFollowUp.AmountReceived) AS IPDue_By_Insurer-IP AS Balance, (((Hosp_Charges-Hosp_Dct_to_Insurer)*100)/Due_By_Insurer) AS perc_hospital, (((Prof_Charges-Prof_Dct_to_Ins)*100)/Due_By_Insurer) AS perc_professional, ((Balance*perc_hospital)/100) AS Hosp_Balance, ((Balance*perc_professional)/100
AS 
Prof_Balance, (Hosp_Balance*Hosp_Pct_to_MD) AS Hosp_Fees_Outs, (Prof_Balance*Prof_Pct_to_MD) AS Prof_Fees_Outs, (Hosp_Fees_Outs+Prof_Fees_Outs
AS 
Total_Fees_OutstandingClaims.ClaimStatusClaims.Responsible


FROM Claims LEFT JOIN ClaimsFollowUp ON Claims
.ClaimID=ClaimsFollowUp.RepricingID
LEFT JOIN Repricing ON ClaimsFollowUp
.RepricingID=Repricing.RepricingID 



GROUP BY Claims
.ClaimStatusClaims.ClaimIDRepricing.ConvertedTotalChargesRepricing.ConvertedProfessionalChargesRepricing.ConvertedHospitalChargesClaims.HospitalChargesDiscountClaims.ProfessionalChargesDiscountRepricing.ProfessionalChargesDiscountAmount
Repricing.HospitalChargesDiscountAmountClaims.DateOfServiceClaims.DateOfReceiptByMDabroadClaims.ResponsibleClaims.InsurerID
Claims.ProviderIDClaims.PatientID
  #8 (permalink)  
Antiguo 23/11/2005, 02:56
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
¿No te funcionó la consulta que te pasé??
Código:
FROM Claims, ClaimsFollowUp, Repricing
WHERE (Claims.ClaimID=ClaimsFollowUp.RepricingID AND Claims.ClaimID=Repricing.RepricingID) 
or (Claims.ClaimID=ClaimsFollowUp.RepricingID AND Claims.ClaimID not in (Select RepricingID From Repricing)) or  
(ClaimID not in  (Select RepricingID From claimsFollowUp) and ClaimID not in (Select RepricingID From Repricing))
  #9 (permalink)  
Antiguo 23/11/2005, 07:31
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Gracias Master Pero no funcionó.........no sale error ni nada pero se bloquea la aplicación. Ha de ser muy compleja para Access. Total que no funciona.

Saludos.
  #10 (permalink)  
Antiguo 23/11/2005, 09:04
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
aJÁ,

Ya me lista lo que quiero, es decir todos los de Claims aunque no tengan registro en Claims FollowUp.

El punto está en que no me muestra los valores de los campos correspondientes de Claims y Repricing.

Es Decir Claims y Repricing siempre están relacionados.

Tengo:


Código PHP:
FROM Claims LEFT JOIN (ClaimsFollowUp LEFT JOIN Repricing ON ClaimsFollowUp.RepricingID=Repricing.RepricingIDON Claims.ClaimID=ClaimsFollowUp.RepricingID 
Espero vuestra Ayuda.

Saludos y Gracias.
  #11 (permalink)  
Antiguo 23/11/2005, 10:22
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Haber si te he entendido bien y Claims y Recipring siempre van a estar relacionados deben salir ambos, es que acces es muy puñetero, por que por lo que veo necesitas parentesis para hacer relaciones cruzadas, entonces vamos a intentar lo siguiente (quizá me equivoque xq nunca he usado access pero se puede intentar)

Código:
FROM
(Claims INNER JOIN Repricing ON Repricing.RepricingID=Claims.ClaimID) 
LEFT JOIN ClaimsFollowUp ON CFU.RecipringID=Repricing.RepricingID
Aqui relaciono Claims con repricing mediante el repricingid y el claimid, es una suposición mía a partir de lo visto, no se si te servirá.

Suerte
  #12 (permalink)  
Antiguo 23/11/2005, 10:45
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Que tal Master, Gracias por contestar,

Acabo de probar lo que pusiste pero No Rula.

Tu lógica es muy buena. Quiero volverme a explicar:

Bien qué es lo que necesito?

Como verás la consulta hace algunos calculos matemáticos operando entre respectivos campos de diferentes tablas.

Necesito Seleccionar Los Campos de la Consulta Para todos Los Claims, Así tengan Pagos(Registros en ClaimsFollowUp) O No los tengan.

Eso lo estoy logrando con el ultimo code que puse en el post.

Lo que ocurre es que esos registros que ahora sí se muestran y No tienen registros en ClaimsFollowUp están omitiendo sus registros correspondientes de la
tabla Repricing como ConvertedprofessionalCharges, etc.


Esto es lo ultimo que me falta.
  #13 (permalink)  
Antiguo 23/11/2005, 11:09
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Y no rula la consulta,mmm, me cago en access. Has tenido en cuenta la abreviatura CFU cambiandolo por el nombre completo??Si es así, vamos a probar dándole la vuelta.
Código:
FROM
ClaimsFollowUp right join
(Claims INNER JOIN Repricing ON Repricing.RepricingID=Claims.ClaimID)
ON CFU.RecipringID=Repricing.RepricingID
Es por probar, porque no se porque no te coje la otra
  #14 (permalink)  
Antiguo 23/11/2005, 11:19
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Bueno, cuando coloco lo que me acabas de sugerir:

Código PHP:
FROM
ClaimsFollowUp right join
(Claims INNER JOIN Repricing ON Repricing.RepricingID=Claims.ClaimIDON ClaimsFollowUp.RecipringID=Repricing.RepricingID 
Me pide este Dato "Manualmente":



Y luego me muestra la consulta ejecutada (Los nombres de las columnas) pero sin datos.

  #15 (permalink)  
Antiguo 23/11/2005, 11:28
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Buf, pues no se, (asi que ya no soy master, jeje), si quieres pasame una semiestructura las 3 tablas (solo ids relacionados y un campo + por tabla) con datos de prueba si quieres a [email protected]

y lo miro tranquilamente en access en casa, (aqui no tengo access)
  #16 (permalink)  
Antiguo 23/11/2005, 11:39
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Ok, Gracias, ya te he escrito. Sin embargo si a alguien se le ocurre alguna otra solución, planteamieto, etc, Bienvenido Sea.

Saludos.
  #17 (permalink)  
Antiguo 23/11/2005, 11:39
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 4 meses
Puntos: 11
Ya te envie un MP pidiendote lo mismo, la estructura con algunos Datos para probar
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #18 (permalink)  
Antiguo 23/11/2005, 17:06
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Muchas Gracias a Linterns por su Ayuda, Funciona corectamente con:

Código PHP:
FROM (Claims INNER JOIN Repricing ON Claims.ClaimID Repricing.RepricingIDLEFT JOIN ClaimsFollowUp ON Repricing.RepricingID ClaimsFollowUp.RepricingID
WHERE 
(Claims.ClaimStatus)<>"9. Case Closed" 


Tengo una Inquietud Final,


Cuando Hago esta operación con Access

Código PHP:
SUM(ClaimsFollowUp.AmountReceived) AS IPDue_By_Insurer-IP AS Balance 

Y la SUM Devuelve NULL (Ni siquiera devuelve cero Porque No existen los ampos asociados
ClaimsFollowUp.AmountReceived que son los que hacen la suma) la siguiente operación que da Bloqueada


Código PHP:
Due_By_Insurer-IP AS Balance 
Y entonces algunos campos de la Columna Balance quedan vacíos, porque supongo que en estos casos es como restar Due_By_Insurer-NULL o algo así.

El Punto es, como puedo dejar por defecto que si

Código PHP:
SUM(ClaimsFollowUp.AmountReceived) AS IP 
devuelve Null o los campos asociados no existen, tome Cero 0 por defecto?

Porque esto me "mata" los calculos que hago para estos registros.

Uso Access 2003

Infinitamente Agradecido.
  #19 (permalink)  
Antiguo 23/11/2005, 17:18
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 4 meses
Puntos: 11
prueba con

Código:
SUM(   IsNull(ClaimsFollowUp.AmountReceived), 0 ,  ClaimsFollowUp.AmountReceived ) AS IP
En sintesis antes de realizar la Suma le asigne a la Tabla que genera en memoria el valor de cero si es nulo y el valor de la columna si no es nulo.
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #20 (permalink)  
Antiguo 24/11/2005, 01:36
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Según entiendo te funciona con esto:
Código:
FROM 
(Claims INNER JOIN Repricing ON Claims.ClaimID = Repricing.RepricingID) LEFT JOIN ClaimsFollowUp ON Repricing.RepricingID = ClaimsFollowUp.RepricingID
WHERE (Claims.ClaimStatus)<>"9. Case Closed"
Sin embargo, la que te puse en #11, no.
Código:
FROM
(Claims INNER JOIN Repricing ON Repricing.RepricingID=Claims.ClaimID) 
LEFT JOIN ClaimsFollowUp ON ClaimsFollowUp .RecipringID=Repricing.RepricingID
¿Porqúe si se añade el where access lo saca bien, y si no se pone, no??
  #21 (permalink)  
Antiguo 24/11/2005, 08:02
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Bueno, esto probando con :

Código PHP:
SUM (IS NULL(ClaimsFollowUp.AmountReceived), ,  ClaimsFollowUp.AmountReceived ) AS IP
Y Me sale este Error.............Si funcionará en Access? Que ptra forma de sintaxis? La verdad yo que se muy poco me sorprendo de muchas cosas que no soporta Access.




Pero Bueno, Gracias por la ayuda, solo falta por resolver esto.
  #22 (permalink)  
Antiguo 24/11/2005, 08:15
 
Fecha de Ingreso: octubre-2005
Mensajes: 365
Antigüedad: 18 años, 7 meses
Puntos: 0
Acabo de Pillar la Sintaxis Correcta :

Código PHP:
SUM(IIF(ISNULL(ClaimsFollowUp.AmountReceived), 0ClaimsFollowUp.AmountReceived)) AS IP

Gracias a este Site:

http://elguruprogramador.com.ar/foro...je.asp?id=1136


Maestros, de Verdad Muchas Gracias por la ayuda.

A la ultima Duda de Jose Minglein yo he visto que Access no Soporta Plenamente el estandar SQL92, sino que tiene su propio estándar (Microsoft SQL Server supongo) que se llama TransactSQL, entonces muchas cosas me imagino se ejecutan de manera diferente.

Nuevamente Gracias, Espero no volver a Molestarlos por un rato, pero no sé sino puedo con algo Acudo a Los Maestros.

Saludos.
  #23 (permalink)  
Antiguo 24/11/2005, 10:46
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 4 meses
Puntos: 11
definitivamente no se en que momento perdi el "IIF(" :p
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
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 11:01.