2017-03-02 79 views
0

所以我有一个重复问题与我的一个报告。 我目前通过运行的Microsoft SQL Server 2012 此查询就是我一起工作:重复问题与查询

SELECT 
    oh.ORDERNO, 
    od.Rxnum, 
    oh.STATUS, 
    datediff(hh, o.recvtime, getdate()) as ageInHours 

FROM 
    mck_hvs.ORDERHEADER oh with (nolock), 
    mck_hvs.ORDERDETAILS od with (nolock), 
    mck_hvs.SCRIPTITEMS si with (nolock), 
    mck_hvs.orderheader o with(nolock) 

WHERE 
    oh.orderno = od.orderno and 
    si.orderno = od.orderno and 
    oh.STATUS = 550 and 
    od.DrugClass = 'C2' and 
    datediff(hh, o.recvtime, getdate()) <24 

ORDER BY 
    oh.STATUS, 
    oh.orderno, 
    od.rxnum, 
    datediff(hh, o.recvtime, getdate()) desc 

我想获得一份报告,列出了具体的订单号码,我的药店,它会列出它们关闭,但可以有20-30页的相同订单号码信息。

+1

我猜你的连接会导致比你想要的更多的行。也许一次添加一个表并使用现代连接语法。 – Degan

回答

1

正确,这就是SQL的工作方式:对每个匹配的细节(如OrderDetails中)重复一个头(如在OrderHeader中)。您可能需要额外的处理(可能使用另一种语言 - 工具)以实现报告的“更好”格式。

0

主要的问题是你在没有连接条件的情况下在两个Orderheader表副本之间进行自连接。无论何时您在没有连接条件的情况下进行连接,都可以获得您加入的所有表的组合。在这种情况下,如果您在Orderheader表中有1000行,则这个连接会在答案中给您1,000,000行。我建议你在SQL中使用“join”语法。这使得它更清楚连接条件是什么。如果你想在你的结果中使用Orderheaders,即使你没有匹配的订单细节或者脚本项,你也需要将该表的连接改为左连接。你的查询应该是这样的:

SELECT 
    oh.ORDERNO, 
    od.Rxnum, 
    oh.STATUS, 
    datediff(hh, o.recvtime, getdate()) as ageInHours 
FROM 
    mck_hvs.ORDERHEADER as oh inner join 
    mck_hvs.ORDERDETAILS as od on oh.orderno = od.orderno inner join 
    mck_hvs.SCRIPTITEMS as si on si.orderno = od.orderno inner join 
    mck_hvs.orderheader as o on <<MISSING JOIN CONDITION GOES HERE>> 
WHERE 
    oh.STATUS = 550 and 
    od.DrugClass = 'C2' and 
    datediff(hh, o.recvtime, getdate()) <24 
ORDER BY 
    oh.STATUS, 
    oh.orderno, 
    od.rxnum, 
    datediff(hh, o.recvtime, getdate()) desc