transact examples ejemplos attribute sql join reporting-services

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:

  1. primero se produce CARTESIAN JOIN,
  2. que la condición ON se realiza en el conjunto de resultados produciendo un subconjunto de filas,
  3. después de que las filas externas se anexen con NULLs en las columnas unidas de la tabla interna,
  4. 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.