使用具有多个条件的DELETE FROM子句和来自另一个表的数据

问题描述

我有两个桌子。一个是具有价格变动的表,另一个是具有价格变动和调整后的收益的表。

我想基于退货表中的数据从价格变动表中删除数据。

价格变动表如下:

SecurityID TradeDate  OneDayReturn  
3774978    8/20/2020  -0.0013  
3775071    8/20/2020  -0.0034  
3775156    8/20/2020  -0.027  
3776090    8/20/2020  -0.0012  

返回表如下:

SecurityID  TradeDate  OneDayReturn  TodaysIndexSecurityId  IndexReturn TodaysBeta   AdjReturn  
3774978     8/20/2020  -0.0013       21814                  0.0033      0.246153161  0.000812305  
3775071     8/20/2020  -0.0034       14278                  NULL        0.952705801  NULL  
3775156     8/20/2020  -0.027        21814                  0.0033      1.57887578   0.00521029  
3776090     8/20/2020  -0.0012       6859                   NULL        1.478636146  NULL

我想从价格变动中删除ABS(AdjReturn * 2)大于ABS(OnedayReturn)的行,但是如果OneDayReturn和IndexReturn之间有符号翻转,请保留该行。因此,我的意思是仅在OneDayReturn * IndexReturn为正数时删除它。

我尝试过:

DELETE FROM #PriceMovements
WHERE (ISNULL( ABS( SELECT AdjReturn * 2 FROM #AdjReturnTable ),0 ) > 
ABS(OneDayReturn) AND ISNULL(OneDayReturn,0) * ISNULL(IndexReturn,0) > 0); 

我遇到以下错误

第15层状态1线129的消息
关键字附近的语法不正确 'SELECT'。
消息102,第15级,状态1,第129行
语法不正确 ')'。

我认为这意味着我使用了不正确的AND或无法在此语句中引用其他表...但这是为什么?

解决方法

您可以将EXISTSSecurityID一起用作常见的匹配列:

DELETE p
  FROM #PriceMovements p
 WHERE EXISTS ( SELECT 0
                  FROM #AdjReturnTable 
                 WHERE ISNULL(ABS (AdjReturn * 2),0) > ABS(OneDayReturn) 
                   AND ISNULL(OneDayReturn,0) * ISNULL(IndexReturn,0) > 0
                   AND SecurityID = p.SecurityID );

对于您而言,SELECT语句嵌套在函数中的位置错误。