2012-09-17 143 views
21

我有一個查詢從三個表中使用LEFT OUTER JOIN爲兩個連接提取數據。我需要查詢返回最左邊的(Salesrep表)信息,即使兩個右表(分別爲開處方和處方)中沒有相應的數據。當我在WHERE子句中運行沒有日期參數的查詢時,我得到了預期的回報,但只要包含日期參數,我就沒有返回沒有匹配的salesrep數據的情況。我需要至少查看查詢中請求的salesrep表列。左外連接不工作?

這是查詢...任何幫助非常感謝。

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

什麼DBMS? (脫離主題,但我討厭毒品代理和藥品行業) – Kermit

+3

@njk(偏離主題)這並不令人意外,考慮到媒體對該行業的強烈偏見:) – dasblinkenlight

回答

53

你應該繼續前進prescriptions.filldate限制進入的加入ON條件,並從where條款中刪除:

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

否則,條目其中有沒有prescriptions結束了null s在prescriptions.filldateWHERE條款將它們扔掉。

+0

Thanks dasblinkenlight! – jgiven

0

這是因爲您的prescriptions.filldate不等式正在過濾出在prescriptions.filldate列中沒有值的salesrep行。

因此,如果存在空值(沒有來自右表的匹配數據),那麼整個行(包括salesrep數據)都會被日期過濾器過濾掉 - 因爲null不在兩個日期之間。

11

Here你可以找到關於查詢處理階段的簡要描述(這對大多數DBMS來說很常見)。你會發現在那裏,這對於OUTER JOIN:

  1. 第一CARTESIAN JOIN產生時,
  2. 比ON條件的行的結果集產生子集執行,
  3. 後比外行與所附內部表連接列上的NULL,
  4. 對該結果應用WHERE子句執行過濾。

當您將條件放在觸及外部表格行的WHERE子句中時,它們全部被丟棄。您應該簡單地將該條件放置在ON子句中,因爲在添加外部行之前對其進行評估。

因此,這些條件:

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

應該搬進條款。