SQL 服务器游标、循环和基于集合的逻辑
SQL Server Cursors, Loops and Set based Logic
使用 SQL 服务器 Select 我的纽约证券交易所 table 中的每家公司:
- 最后交易价格(来自我的合约 table)
- 最高出价(来自我的出价table)
- 最低要价(来自我的要价 table)
我已经用 CURSOR 完成了它并且正在研究 WHILE LOOP 但是在做这么多答案时建议 SET BASED LOGIC(连接等)可以完成这个。但是,我看不到基于集合的逻辑如何可以 return 来自合同 table 的 MAX(TimePlaced) 与来自 tables 的 MAX(BidPrice) 和 MIN(AskPrice) 在同一行.
为伪代码(实际上比这复杂得多)和作为菜鸟表示歉意——是一个 better/practical Web 应用程序填充 HTML 输出中每个单元格的解决方案table 通过单独的查询???
您有 4 个 table,纽约证券交易所,合同,出价,要价。假设所有 4 tables 都有一个列 CompanyId 并且 NYSE 是主要的 table(其他 tables 中的任何 companyid 都将在 NYSE),这很容易使用 common table 表达式语法。
;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
合同上的加入有一个额外的条件,因为我们想要最新的价格,而不是最大或最小的,所以结果必须被分解并排序一些,这就是分区和排序依据所做的.
上述查询还包含这样的假设:虽然在 nyse 中的条目是必需的,但在其他 tables 中的条目是可选的。如果其他 table 中的条目是强制性的,则可以进一步简化查询。
使用 SQL 服务器 Select 我的纽约证券交易所 table 中的每家公司:
- 最后交易价格(来自我的合约 table)
- 最高出价(来自我的出价table)
- 最低要价(来自我的要价 table)
我已经用 CURSOR 完成了它并且正在研究 WHILE LOOP 但是在做这么多答案时建议 SET BASED LOGIC(连接等)可以完成这个。但是,我看不到基于集合的逻辑如何可以 return 来自合同 table 的 MAX(TimePlaced) 与来自 tables 的 MAX(BidPrice) 和 MIN(AskPrice) 在同一行.
为伪代码(实际上比这复杂得多)和作为菜鸟表示歉意——是一个 better/practical Web 应用程序填充 HTML 输出中每个单元格的解决方案table 通过单独的查询???
您有 4 个 table,纽约证券交易所,合同,出价,要价。假设所有 4 tables 都有一个列 CompanyId 并且 NYSE 是主要的 table(其他 tables 中的任何 companyid 都将在 NYSE),这很容易使用 common table 表达式语法。
;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
合同上的加入有一个额外的条件,因为我们想要最新的价格,而不是最大或最小的,所以结果必须被分解并排序一些,这就是分区和排序依据所做的.
上述查询还包含这样的假设:虽然在 nyse 中的条目是必需的,但在其他 tables 中的条目是可选的。如果其他 table 中的条目是强制性的,则可以进一步简化查询。