重复问题与查询
问题描述:
所以我有一个重复问题与我的一个报告。 我目前通过运行的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页的相同订单号码信息。
答
正确,这就是SQL的工作方式:对每个匹配的细节(如OrderDetails中)重复一个头(如在OrderHeader中)。您可能需要额外的处理(可能使用另一种语言 - 工具)以实现报告的“更好”格式。
答
主要的问题是你在没有连接条件的情况下在两个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
我猜你的连接会导致比你想要的更多的行。也许一次添加一个表并使用现代连接语法。 – Degan