问题描述
我有两个桌子。一个是具有价格变动的表,另一个是具有价格变动和调整后的收益的表。
我想基于退货表中的数据从价格变动表中删除数据。
价格变动表如下:
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或无法在此语句中引用其他表...但这是为什么?
解决方法
您可以将EXISTS
与SecurityID
一起用作常见的匹配列:
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语句嵌套在函数中的位置错误。