2012-09-17 22 views
21

Tengo una consulta que extrae datos de tres tablas utilizando IZQUIERDA UNIÓN EXTERNA 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 la devolución esperada, pero tan pronto como incluyo los parámetros de fecha, no devuelven nada donde no hay datos coincidentes para una venta. Necesito al menos ver las columnas de la tabla Salesrep solicitadas en la consulta.Left Outer Join ¿No funciona?

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 
+1

¿Qué DBMS? (Fuera del tema, pero odio las repeticiones de drogas y la industria farmacéutica) – Kermit

+3

@njk (Fuera de tema) esto no es sorprendente en absoluto, teniendo en cuenta un fuerte sesgo mediático contra la industria :) – dasblinkenlight

Respuesta

53

Debe mover las limitaciones de prescriptions.filldate en el ON estado de la unión, y sacarlo de la where cláusula:

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 los cuales no hay prescriptions terminar con null s en prescriptions.filldate, y la cláusula WHERE los arroja.

+0

Gracias dasblinkenlight! – jgiven

0

Esto se debe a que las desigualdades prescriptions.filldate están filtrando las filas salesrep que no tienen un valor en la columna prescriptions.filldate.

Entonces, si hay valores nulos (no coinciden los datos de las tablas correctas), toda la fila, incluidos los datos de ventas, se filtran por los filtros de fecha, porque el null no se encuentra entre las dos fechas.

11

Here puede encontrar una breve descripción sobre las fases de procesamiento de consultas (es común para la mayoría de los DBMS). Va a encontrar por ahí, que para la combinación externa:

  1. primera cartesiana se produce,
  2. que el estado CERRADO se realiza en conjunto de resultados que produce subconjunto de filas,
  3. después de filas exteriores se anexan con NULL 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.

Por lo tanto, esas condiciones:

prescriptions.filldate >= '09-01-12' AND 
prescriptions.filldate <= '09-17-12' 

deben moverse en la cláusula ON.