ejemplos - transact sql examples
La uniĆ³n externa izquierda no funciona? (3)
Debe mover las restricciones en prescriptions.filldate
a la condición ON
de la unión, y eliminarla de la cláusula where
:
LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no
AND prescriptions.filldate >= ''09-01-12''
AND prescriptions.filldate <= ''09-17-12''
De lo contrario, las entradas para las que no hay prescriptions
terminan con null
en prescriptions.filldate
, y la cláusula WHERE
los descarta.
Tengo una consulta que extrae datos de tres tablas con LEFT OUTER JOIN para ambas uniones. Necesito la consulta para devolver la información más a la izquierda (tabla Salesrep) incluso si no hay datos correspondientes en las dos tablas correctas (prescriptor y recetas, respectivamente). Cuando ejecuto esta consulta sin los parámetros de fecha en la cláusula WHERE, obtengo el retorno esperado, pero tan pronto como incluyo los parámetros de fecha, no me devuelven nada cuando no hay datos coincidentes para una venta. Necesito al menos ver las columnas de la tabla Salesrep solicitadas en la consulta.
Aquí está la consulta ... cualquier ayuda es MUY muy apreciada.
SELECT salesrep.salesrepid as SalesRepID,
salesrep.fname as SalesrepFName,
salesrep.lname as SalesRepLName,
salesrep.fname+'' ''+salesrep.lname as SalesRepFullName,
prescriber.dea_no as PDeaNo,
prescriber.lname+'', ''+prescriber.fname as DocName,
CONVERT(VARCHAR(8), prescriptions.filldate, 1) as FillDate,
prescriptions.drugname as DrugName,
prescriptions.daysupply as Supply,
prescriptions.qtydisp as QtyDisp,
prescriptions.rx_no as Refill,
prescriptions.copay as Sample,
ROUND(prescriptions.AgreedToPay-(prescriptions.AgreedToPay*.07),2) as AgreedToPay,
prescriptions.carrierid as CarrierID
FROM salesrep
LEFT OUTER JOIN prescriber on salesrep.salesrepid = prescriber.salesrepid
LEFT OUTER JOIN prescriptions on prescriber.dea_no = prescriptions.dea_no
WHERE salesrep.salesrepid = 143 AND
prescriptions.filldate >= ''09-01-12'' AND
prescriptions.filldate <= ''09-17-12''
ORDER BY prescriptions.filldate
Esto se debe a que sus prescriptions.filldate
inequalities están filtrando las filas de salesrep
que no tienen un valor en la columna prescriptions.filldate
.
Por lo tanto, si hay valores nulos (no coinciden los datos de las tablas correctas), toda la fila, incluidos los datos de ventas, se filtra por los filtros de fecha, porque el null
no se encuentra entre las dos fechas.
Here puede encontrar una breve descripción sobre las fases de procesamiento de consultas (es común para la mayoría de los DBMS). Descubrirá que para OUTER JOIN:
- primero se produce CARTESIAN JOIN,
- que la condición ON se realiza en el conjunto de resultados produciendo un subconjunto de filas,
- después de que las filas externas se anexen con NULLs en las columnas unidas de la tabla interna,
- en ese resultado, se aplica la cláusula WHERE para realizar el filtrado.
Cuando coloca la condición dentro de la cláusula WHERE que toca las filas de las tablas externas, todas se descartan. Simplemente debe colocar esa condición dentro de la cláusula ON, ya que esa se evalúa antes de que se anexen las filas externas.
Entonces, esas condiciones:
prescriptions.filldate >= ''09-01-12'' AND
prescriptions.filldate <= ''09-17-12''
debe moverse a la cláusula ON.