我知道有几篇关于尝试在存储过程中循环 SQL Server 是多么糟糕的帖子。但我还没有完全找到我想要做的事情。我们正在使用可以在内部直接链接到 Excel 的数据连接。
我看过一些帖子,有些人说他们可以将大多数循环转换为标准查询。但是对于我的生活,我遇到了这个问题。
我需要custID
在 38,40 类型的事件之前有订单的所有 s。但只有在事件和第一个查询中的顺序之间没有其他顺序时才获取它们。
所以有3个部分。我首先根据时间范围将所有订单(订单表)查询到临时表中。
Select into temp1 odate, custId from orders where odate>'5/1/12'
然后我可以使用临时表在辅助表上进行内部连接,以获取可能在当前订单之前的某个时间发生的客户事件(LogEvent 表)。
Select into temp2 eventdate, temp1.custID from LogEvent inner join temp1 on
temp1.custID=LogEvent.custID where EventType in (38,40) and temp1.odate>eventdate
order by eventdate desc
这里的问题是,我尝试运行的查询将从第一个查询中返回每个客户的所有行,我只希望每个客户的最新数据。所以这是在客户端我会循环只得到一个事件而不是所有旧事件的地方。但由于所有查询都必须在 Excel 中运行,我无法真正循环客户端。
然后,第三步可以使用第二个查询的结果来检查事件是否发生在最新订单和任何先前订单之间。我只想要事件在订单之前的数据,并且中间没有其他订单。
Select ordernum, shopcart.custID from shopcart right outer join temp2 on
shopcart.custID=temp2.custID where shopcart.odate >= temp2.eventdate and
ordernum is null
有没有办法简化这一点并使其基于集合在 SQL Server 中运行,而不是我在客户端执行的某种循环?