SQL Server游标,循环和基于集的逻辑

时间:2016-12-16 01:41:35

标签: sql sql-server while-loop set cursor

使用SQL Server为我的NYSE表中的每个公司选择:

  • 最后交易价格(来自我的合约表)
  • 最高出价(来自我的出价表)
  • Min Ask Price(来自我的Asks表)

我已经用CURSOR完成了它并且正在研究WHILE LOOP但是这样做很多答案表明SET BASED LOGIC(连接等)可以实现这一点。但是,我不知道基于集合的逻辑如何从与其表中的MAX(BidPrice)和MIN(AskPrice)相同的行中的Contracts表返回MAX(TimePlaced)。

伪代码的道歉(它实际上比这复杂得多)和作为菜鸟 - 是一个更好/实用的解决方案,Web应用程序通过单独填充HTML输出表中的每个单元格查询???

1 个答案:

答案 0 :(得分:1)

你有4张桌子,纽约证券交易所,合约,投标,要求。假设所有4个表都有一个Column CompanyId并且NYSE是主表(其他表中的任何一个companyid将在NYSE中),使用公用表表达式语法很容易。

;with Ct as (Select n.CompanyId, c.lastradeprice,
 row_number() over (partition by n.companyid 
                    order by tradedatetime desc) rw
      From nyse n inner join contract c on c.companyid =n.companyid),
Bd as (Select n.CompanyId, max(bc.bidprice) bidprice 
      From nyse n inner join bids b on b.companyid =n.companyid
      Group by n.companyid),
Ak as (Select n.CompanyId, min(a.askprice) AskPrice 
      From nyse n inner join asks a on a.companyid =n.companyid
      Group by n.companyid)
Select n.companyId, ct.lasttradeprice, bd.tradeprice, ak.AskPrice
From nyse n
    Left join ct on ct.companyid = n.companyId and rw=1
    Left join bd on bd.companyid = n.companyid
    Left join ak on ak.companyid = n.companyid

合同上的加入有一个额外的条件,因为我们想要最新的价格,而不是最大价格或最小价格,所以结果必须分解并订购someho,这就是分区和订单所做的。 / p>

上述查询还包含以下假设:当需要nyse中的条目时,其他表中的条目是可选的。如果其他表中的条目是必需的,则可以进一步简化查询。