更新临时表上的连接表

时间:2015-11-02 16:45:37

标签: sql sql-server

我有两张桌子,

tblFXRates

  Base    Quote   Rate
  USD     JPY     1.5     
  USD     GBP     2.5 
  USD     EUR     1.75 
  EUR     JPY     1.5 
  USD     USD     1

tblHoldings

 FX      FXRate  
 EUR     null
 EUR     null
 USD     null
 GBP     null
 JPY     null

我想要做的是更新tblHoldings中的FXRate。所以我想选择tblFXRates中基数等于USD的所有费率。然后将此查询的结果加入tblHoldings中的FX列以更新FXRate。它看起来应该如下所示,

结果

 FX      FXRate  
 EUR     1.75
 EUR     1.75
 USD     1
 GBP     2.5
 JPY     1.5

我不知道如何执行此操作,因为嵌套查询会让我失望。到目前为止我的尝试(非常简洁)在下面,

update h
set h.FXRate = fx.rate
from tblHoldings h
inner join fx
on h.FX = fx.Quote
with fx as
( 
   select quote, rate 
   from tblFxRates 
   where base = 'USD'
)

3 个答案:

答案 0 :(得分:1)

试试这个。

update h
set h.FXRate = fx.rate
from tblHoldings h
inner join tblfxrates f on h.FX = f.Quote
where h.base = 'USD'

答案 1 :(得分:1)

我认为这就是你想要的:

update h
    set h.FXRate = fx.rate
    from tblHoldings h inner join
         fx
         on h.FX = fx.Quote and fx.base = 'USD';

答案 2 :(得分:1)

您可以使用UPDATE FROM JOIN

UPDATE th
SET FXRate = tr.Rate
FROM #tblHoldings th
JOIN #tblFXRates tr
  ON th.FX = tr.Quote
WHERE tr.Base = 'USD';

LiveDemo

输出:

╔═════╦════════╗
║ FX  ║ FXRate ║
╠═════╬════════╣
║ EUR ║ 1.75   ║
║ EUR ║ 1.75   ║
║ GBP ║ 2.5    ║
║ JPY ║ 1.5    ║
║ USD ║ 1      ║
╚═════╩════════╝

或者您可以使用MERGE声明:

MERGE #tblHoldings AS th
USING #tblFXRates tr
  ON th.FX = tr.Quote
WHEN MATCHED AND tr.Base = 'USD' THEN
   UPDATE SET FXRate = tr.Rate;

LiveDemo2

将检测重复的损坏数据:

INSERT INTO #tblFXRates(Base,Quote,Rate) VALUES ('USD','USD',1);
INSERT INTO #tblFXRates(Base,Quote,Rate) VALUES ('USD','USD',2);

使用UPDATE静默传递。