2012-09-17 4 views
21

Ho una query che recupera i dati da tre tabelle utilizzando LEFT OUTER JOIN per entrambi i join. Ho bisogno che la query restituisca le informazioni più a sinistra (tabella Salesrep) anche se non ci sono dati corrispondenti nelle due tabelle a destra (prescrittore e prescrizioni, rispettivamente). Quando eseguo questa query senza i parametri di data nella clausola WHERE, ottengo il rendimento atteso, ma non appena includo i parametri di data non ottengo nulla restituito dove non ci sono dati corrispondenti per una vendita. Devo almeno vedere le colonne della tabella di vendita richieste nella query.L'esterno sinistro non funziona?

Ecco la query ... qualsiasi aiuto è MOLTO molto apprezzato.

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

Che tipo di DBMS? (Off topic, ma odio i rappresentanti di droga e industria farmaceutica) – Kermit

+3

@njk (Off topic) questo non è affatto sorprendente, considerando una forte inclinazione mediatica contro l'industria :) – dasblinkenlight

risposta

53

Si dovrebbe spostare i vincoli prescriptions.filldate nella ON condizioni del join, e rimuoverlo dalla clausola where:

LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no 
          AND prescriptions.filldate >= '09-01-12' 
          AND prescriptions.filldate <= '09-17-12' 

In caso contrario, le voci per le quali non sono mai fine prescriptions con null s in prescriptions.filldate e la clausola WHERE li butta via.

+0

Grazie dasblinkenlight! – jgiven

0

Questo perché le disuguaglianze prescriptions.filldate stanno filtrando le righe salesrep che non hanno un valore nella colonna prescriptions.filldate.

Quindi se ci sono valori nulli (nessun dato corrispondente dalle tabelle giuste), allora l'intera riga, compresi i dati di vendita, viene filtrata dai filtri di data, perché il null non rientra tra le due date.

11

Here è possibile trovare una breve descrizione delle fasi di elaborazione delle query (è comune per la maggior parte dei DBMS). Troverete là fuori, che per il join esterno:

  1. primo cartesiana è prodotto,
  2. rispetto alla condizione ON viene eseguita su set di risultati che produce sottoinsieme di righe,
  3. dopo di file esterne vengono aggiunti con NULL sulle colonne unite del tavolo interno,
  4. su tale risultato viene applicata la clausola WHERE che esegue il filtraggio.

Quando si posiziona la condizione all'interno della clausola WHERE che tocca le righe dei tavoli esterni vengono scartate tutte. Dovresti semplicemente posizionare quella condizione all'interno della clausola ON, dato che quella viene valutata prima che le righe esterne vengano aggiunte.

Quindi, queste condizioni:

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

dovrebbero essere spostati nella clausola ON.

Problemi correlati