左外连接不起作用?

jgi*_*ven 33 sql join reporting-services

我有一个查询从三个表中使用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
Run Code Online (Sandbox Code Playgroud)

das*_*ght 69

您应该将约束移动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'
Run Code Online (Sandbox Code Playgroud)

否则,没有prescriptions结束nulls 条目的条目prescriptions.filldate,并且该WHERE条款将它们抛弃.


Woj*_*usJ 15

在这里,您可以找到有关查询处理阶段的简要说明(这对大多数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'
Run Code Online (Sandbox Code Playgroud)

应该转入ON条款.