Sql server 2008 组合一个SQL存储过程

Sql server 2008 组合一个SQL存储过程,sql-server-2008,tsql,Sql Server 2008,Tsql,所以我有几个SQL命令,基本上我想做一个proc,但在做这件事的时候,我想对它们进行一些优化 第一部分是: select tr_reference_nbr from cfo_daily_trans_hist inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_

所以我有几个SQL命令,基本上我想做一个proc,但在做这件事的时候,我想对它们进行一些优化

第一部分是:

select tr_reference_nbr
from cfo_daily_trans_hist
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id
inner join cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id AND fpv_status_bit = 1
group by tr_reference_nbr, fv_dh_daily_trans_hist_id
having count(*)>1
此查询返回给我的是系统中存在重复数据的
tr\u reference\u nbr
,需要删除这些重复数据。运行此查询后,我运行另一个查询,在上述查询给我的
tr\u reference\u nbr
中一次复制和粘贴一个:

select 
tr_reference_nbr , dh_daily_trans_hist_id ,cfo_fas157_project_valuation.*,
cfo_daily_trans_hist.* ,
cfo_fas157_valuation.* 
from cfo_daily_trans_hist
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id
iNNER JOIN cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id
where
tr_reference_nbr in
(
[PASTEDREFERENCENUMBER]
)
and fpv_status_bit = 1
order by dh_val_time_stamp desc
现在,这个查询为我提供了一组特定
tr\u reference\u nbr
的记录。然后,我必须查看这些数据并找到具有匹配(重复)dh_daily_trans_hist_id的行。找到后,我会查看并确保以下列也与该行匹配,以便我知道它们是真实的重复项:
fpv未调整的赞助费用
fpv调整的赞助费用
fpv未调整的对手费用
,以及
fpv调整的对手费用

如果这些都匹配,那么我再查看另一列,
fv\u create\u dt
,并确保两个时间戳之间的差异小于一分钟。如果有,我将对先前存储的行运行另一个查询,如下所示:

begin tran
update cfo_fas157_valuation set fpv_status_bit = 0 where fpv_fas157_project_valuation_id = [IDRECIEVEDFROMTHEOTHERTABLE]
commit
正如您所见,这仍然是一个非常手动的过程,尽管我们编写了一些查询,但我正在尝试找到一个解决方案,我们可以只运行一个查询,它基本上可以完成除最终查询之外的所有操作。因此,基本上,这将为我们提供一些需要更新的项目评估id

通过查看这些查询,你们中有人看到了一种简单的方法来组合所有这些吗?我花了一整天的时间在这上面,似乎没有什么东西可以运行。我觉得我一直在搞砸接头之类的东西


谢谢

您可以通过多种方式组合这些查询:

  • 用于存储查询结果-适用于存储过程
  • 用于存储查询结果-适用于存储过程
  • 用于存储查询结果-适用于单个查询
一旦将它们放在单独的表/变量/CTE中,就可以轻松地将它们连接起来

然后,您还需要做一件事,那就是在两个连续的行中查找datetime的差异。有一个技巧可以做到这一点:

  • 用于添加列,列的行数由fv\U create\U dt按分组字段(tr\U reference\U nbr,…)进行划分
  • 在a.ROW\u编号=B.ROW\u编号+1上进行自联接
  • 检查A.fv_create_dt和B.fv_create_dt之间的差异,以筛选差异小于一分钟的行
  • 只需对自连接进行一次良好的测试,以确保只过滤需要过滤的行

    如果您对此仍有疑问,请随时发表评论

    有趣的注意:SQLServerDenali具有T-SQL增强功能,可以在不进行自联接的情况下访问后续行和前一行