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:
当您将条件放在接触外表行的WHERE子句中时,它们都被丢弃.您应该将该条件简单地放在ON子句中,因为在附加外部行之前评估该条件.
所以,那些条件:
prescriptions.filldate >= '09-01-12' AND
prescriptions.filldate <= '09-17-12'
Run Code Online (Sandbox Code Playgroud)
应该转入ON条款.
| 归档时间: |
|
| 查看次数: |
31167 次 |
| 最近记录: |