查询的重复问题

时间:2017-03-02 22:48:10

标签: sql database sql-server-2012

所以我的报告中有一个重复的问题。 我目前正在通过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页。

2 个答案:

答案 0 :(得分:1)

正确,这就是SQL的工作原理:为每个匹配的详细信息重复一个标题(如在OrderHeader中)(如在OrderDetails中)。您可能需要额外的处理(可能使用其他语言 - 工具)来实现更好的&#34;报告的格式。

答案 1 :(得分:0)

主要问题是您在没有连接条件的Orderheader表的两个副本之间进行自联接。每当您在没有连接条件的情况下进行连接时,您将获得所加入的表的每个组合。在这种情况下,如果Orderheader表中有1000行,则此一个连接将在答案中为您提供1,000,000行。我建议您使用&#34; join&#34; SQL中的语法。这使得连接条件更清晰。如果您在结果中需要Orderheaders,即使您没有匹配的orderdetails或scriptitems,那么您需要将该表的连接更改为左连接。您的查询应如下所示:

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